Creazione di una nuova directory in C


96

Voglio scrivere un programma che controlli l'esistenza di una directory; se quella directory non esiste, crea la directory e un file di registro al suo interno, ma se la directory esiste già, crea semplicemente un nuovo file di registro in quella cartella.

Come lo farei in C con Linux?


1
La funzione mkdir crea una nuova directory, blog.tremend.ro/2008/10/06/…
fsonmezay

1
forse è perché puoi trovare la soluzione in google o anche qui facendo una semplice ricerca su stackoverflow.com/search?q=C+make+directory . A proposito, non sono il ragazzo che ha votato.
fsonmezay

Si prega di modificare la tua domanda per mostrare il codice che avete finora . Dovresti includere almeno uno schema (ma preferibilmente un minimo esempio riproducibile ) del codice con cui hai problemi, quindi possiamo provare ad aiutare con il problema specifico. Dovresti anche leggere Come chiedere .
Toby Speight

Risposte:


146

Guarda statper verificare se la directory esiste,

E mkdirper creare una directory.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

if (stat("/some/directory", &st) == -1) {
    mkdir("/some/directory", 0700);
}

È possibile consultare il manuale di queste funzioni con i comandi man 2 state man 2 mkdir.


5
Credo che mkdirsotto Linux sia necessario un secondo parametro, modeoltre a path.
Paul R

1
@Uku: il passaggio di un numero errato di parametri a una funzione è un comportamento indefinito, quindi anche se potrebbe sembrare che funzioni per te in un caso, non dovresti fare affidamento su di esso.
Paul R

3
Qual è lo scopo di verificare che la directory non esista prima di crearla? Anche se stat dice che non esiste ancora, un altro processo potrebbe averlo creato nel frattempo.
Brandin

2
@Brandin Credo di aver risposto ciecamente alla domanda di OP :) Hai ragione riguardo alle condizioni di gara.
Arnaud Le Blanc

4
Questo sarà segnalato dalla maggior parte dei buoni analizzatori statici come un rischio
TOCTOU

22

Puoi usare mkdir:

$ man 2 mkdir

#include <sys/stat.h>
#include <sys/types.h>

int result = mkdir("/home/me/test.txt", 0777);

Questo rimuoverà e sostituirà le directory esistenti?
jjxtra

@jjxtra :: no, dovrebbe fallire se la directory esiste già, più o meno come se avessi tentato la stessa operazione dalla riga di comando.
Paul R

Questo è quello che avrei immaginato. Qualche problema di prestazioni saltando il controllo delle statistiche e solo mkdir ogni volta?
jjxtra

@jjxtra: a meno che tu non stia creando migliaia di directory, non riesco a immaginare che ci sarebbe una differenza misurabile nelle prestazioni.
Paul R

7

Voglio scrivere un programma che (...) crei la directory e un (...) file al suo interno

poiché questa è una domanda molto comune, ecco il codice per creare più livelli di directory e poi chiamare fopen. Sto usando un'estensione gnu per stampare il messaggio di errore con printf.

void rek_mkdir(char *path) {
    char *sep = strrchr(path, '/');
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = '/';
    }
    if(mkdir(path, 0777) && errno != EEXIST)
        printf("error while trying to create '%s'\n%m\n", path); 
}

FILE *fopen_mkdir(char *path, char *mode) {
    char *sep = strrchr(path, '/');
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}

3
solo i miei 5 centesimi - la modalità 0777 per dir potrebbe non essere desiderata - forse 0755 è meglio, o anche passare per parametro?
ivan.ukr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.