Erstellen eines neuen Verzeichnisses in C.

97

Ich möchte ein Programm schreiben, das die Existenz eines Verzeichnisses überprüft. Wenn dieses Verzeichnis nicht vorhanden ist, werden das Verzeichnis und eine Protokolldatei darin erstellt. Wenn das Verzeichnis jedoch bereits vorhanden ist, wird nur eine neue Protokolldatei in diesem Ordner erstellt.

Wie würde ich das in C mit Linux machen?

Jeegar Patel
quelle
1
mkdir Funktion erstellt ein neues Verzeichnis, blog.tremend.ro/2008/10/06/…
fsonmezay
1
Vielleicht liegt das daran, dass Sie die Lösung in Google oder sogar hier finden können, indem Sie eine einfache Suche in stackoverflow.com/search?q=C+make+directory durchführen . Übrigens bin ich nicht der Typ, der abgestimmt hat.
Fsonmezay
Bitte bearbeiten Sie Ihre Frage, um den Code anzuzeigen , den Sie bisher haben . Sie sollten mindestens eine Gliederung (aber vorzugsweise ein minimal reproduzierbares Beispiel ) des Codes einfügen, mit dem Sie Probleme haben. Dann können wir versuchen, bei dem spezifischen Problem zu helfen. Sie sollten auch lesen, wie man fragt .
Toby Speight

Antworten:

146

Schauen Sie sich statzum Prüfen , ob das Verzeichnis vorhanden ist ,

Und mkdirum ein Verzeichnis zu erstellen.

#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);
}

Sie können das Handbuch dieser Funktionen mit den Befehlen man 2 statund man 2 mkdiranzeigen.

Arnaud Le Blanc
quelle
5
Ich glaube , mkdirunter Linux einen zweiten Parameter benötigt, mode, zusätzlich zu path.
Paul R
1
@Uku: Das Übergeben einer falschen Anzahl von Parametern an eine Funktion ist undefiniertes Verhalten. Obwohl es in einem Fall für Sie zu funktionieren scheint, sollten Sie sich nicht darauf verlassen.
Paul R
3
Was ist der Zweck der Überprüfung, ob das Verzeichnis nicht vorhanden ist, bevor es erstellt wird? Selbst wenn stat sagt, dass es noch nicht existiert, könnte es in der Zwischenzeit von einem anderen Prozess erstellt worden sein.
Brandin
2
@Brandin Ich schätze, ich habe blind auf OPs Frage geantwortet :) Du hast Recht mit der Rennbedingung.
Arnaud Le Blanc
4
Dies wird von den meisten guten statischen Analysatoren als TOCTOU-Risiko gekennzeichnet
kdopen
22

Sie können mkdir verwenden:

$ man 2 mkdir

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

int result = mkdir("/home/me/test.txt", 0777);
Paul R.
quelle
Wird dies vorhandene Verzeichnisse entfernen und ersetzen?
jjxtra
@jjxtra :: nein, es sollte fehlschlagen, wenn das Verzeichnis bereits vorhanden ist, ähnlich wie Sie den gleichen Vorgang über die Befehlszeile versucht haben.
Paul R
Das hätte ich mir gedacht. Gibt es Leistungsprobleme, wenn Sie die Statistikprüfung überspringen und jedes Mal nur mkdir?
jjxtra
@jjxtra: Wenn Sie nicht Tausende von Verzeichnissen erstellen, kann ich mir keinen messbaren Leistungsunterschied vorstellen.
Paul R
7

Ich möchte ein Programm schreiben, das (...) das Verzeichnis und eine (...) Datei darin erstellt

Da dies eine sehr häufige Frage ist, finden Sie hier den Code zum Erstellen mehrerer Verzeichnisebenen und zum Aufrufen von fopen. Ich verwende eine gnu-Erweiterung, um die Fehlermeldung mit printf zu drucken.

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);
}
Jens Harms
quelle
3
nur meine 5 Cent - Modus 0777 für dir ist vielleicht nicht erwünscht - vielleicht ist 0755 besser oder sogar Parameter übergeben?
ivan.ukr