Erstellen eines neuen Verzeichnisses in C

Lesezeit: 4 Minuten

Benutzeravatar von Jeegar Patel
Jeegar Patel

Ich möchte ein Programm schreiben, das die Existenz eines Verzeichnisses prüft; Wenn dieses Verzeichnis nicht existiert, erstellt es das Verzeichnis und eine Protokolldatei darin, aber wenn das Verzeichnis bereits existiert, erstellt es einfach eine neue Protokolldatei in diesem Ordner.

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

  • mkdir-Funktion erstellt ein neues Verzeichnis, blog.tremend.ro/2008/10/06/…

    – fsonmezay

    15. September 2011 um 11:50 Uhr

  • Vielleicht liegt das daran, dass Sie die Lösung in Google oder sogar hier finden können, indem Sie eine einfache Suche auf stackoverflow.com/search?q=C+make+directory durchführen. Übrigens bin ich nicht der Typ, der abgewählt hat.

    – fsonmezay

    15. September 2011 um 11:57 Uhr


  • Bitte bearbeiten Sie Ihre Frage, um sie anzuzeigen den Code, den Sie bisher haben. Sie sollten zumindest eine Gliederung (aber vorzugsweise ein reproduzierbares Minimalbeispiel) des Codes einfügen, mit dem Sie Probleme haben, dann können wir versuchen, Ihnen bei dem spezifischen Problem zu helfen. Sie sollten auch Wie man fragt lesen.

    – Toby Speight

    28. Februar 2018 um 11:45 Uhr

Benutzeravatar von Arnaud Le Blanc
Arnaud Le Blanc

Ansehen stat um zu prüfen, ob das Verzeichnis existiert,

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 dem sehen man 2 stat und man 2 mkdir Befehle.

  • Ich glaube mkdir unter Linux benötigt einen zweiten Parameter, modezusätzlich zu path.

    – PaulR

    15. September 2011 um 11:51 Uhr

  • @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.

    – PaulR

    15. September 2011 um 21:34 Uhr

  • Was ist der Zweck, zu prüfen, ob das Verzeichnis nicht existiert, bevor es erstellt wird? Auch wenn stat sagt, dass es noch nicht existiert, könnte es in der Zwischenzeit von einem anderen Prozess erstellt worden sein.

    – Brandin

    20. August 2015 um 6:21 Uhr

  • @Brandin Ich glaube, ich habe die Frage von OP blind beantwortet 🙂 Sie haben Recht mit der Rennbedingung.

    – Arnaud Le Blanc

    21. August 2015 um 12:39 Uhr

  • Dies wird von den meisten guten statischen Analysatoren als TOCTOU-Risiko gekennzeichnet

    – kdoopen

    22. Juni 2016 um 14:52 Uhr

Benutzeravatar von Paul R
Paul R

Sie können mkdir verwenden:

$ Mann 2 mkdir

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

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

  • Werden dadurch vorhandene Verzeichnisse entfernt und ersetzt?

    – jjxtra

    18. Januar 2017 um 21:50 Uhr

  • @jjxtra:: nein, es sollte fehlschlagen, wenn das Verzeichnis bereits existiert, ähnlich wie wenn Sie dieselbe Operation von der Befehlszeile aus versucht hätten.

    – PaulR

    18. Januar 2017 um 21:54 Uhr

  • Das hätte ich vermutet. Irgendein Leistungsproblem durch Überspringen der Statistikprüfung und jedes Mal nur mkdir?

    – jjxtra

    19. Januar 2017 um 15:40 Uhr

  • @jjxtra: Wenn Sie nicht Tausende von Verzeichnissen erstellen, kann ich mir nicht vorstellen, dass es einen messbaren Leistungsunterschied geben würde.

    – PaulR

    19. Januar 2017 um 18:30 Uhr

  • Versuchen mkdir() direkt statt a stat() first ist schneller, da es einen Systemaufruf spart, wenn das Verzeichnis erstellt wird. Wenn das Verzeichnis bereits beendet wird, dann erfolgreich stat() wird immer noch langsamer sein als die Erfolglosen mkdir()wie stat() muss noch mehr Arbeit erledigen.

    – Kai Petzke

    26. April 2021 um 18:22 Uhr

Benutzeravatar von Jens Harms
Jens Harms

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

Da dies eine sehr häufige Frage ist, ist hier der Code, um mehrere Verzeichnisebenen zu erstellen und dann fopen aufzurufen. Ich verwende eine gnu-Erweiterung, um die Fehlermeldung mit printf zu drucken.

void rek_mkdir(char *path) {
    char *sep = strrchr(path, "https://stackoverflow.com/");
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = "https://stackoverflow.com/";
    }
    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, "https://stackoverflow.com/");
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}

  • nur meine 5 cent – modus 0777 für dir darf nicht erwünscht sein – vielleicht ist 0755 besser, oder gar parameter übergeben?

    – ivan.ukr

    12. August 2018 um 22:51 Uhr

  • @ivan.ukr 0777 ist korrekt, der Modus wird von den Benutzern umask geändert. Z.B. für umask 022 ergibt sich 755 oder für umask 007 770.

    – ich mische

    29. Oktober 2020 um 4:46 Uhr

Benutzeravatar von ShinyHero
Glänzender Held

int mkdir (const char *filename, mode_t mode)

#include <sys/types.h>
#include <errno.h>
#include <string.h>

if (mkdir("/some/directory", S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
    printf("Error: %s\n", strerror(errno));
}

Als Best Practice wird empfohlen, einen Integer-Alias ​​für zu verwenden Modus. Das Argument Modus gibt die Dateiberechtigungen für das neue Verzeichnis an.

Lesen + Schreiben + Ausführen: S_IRWXU (Benutzer), S_IRWXG (Gruppe), S_IRWXO (Andere)

Quelle:
https://www.gnu.org/software/libc/manual/html_node/Permission-Bits.html

Wenn Sie wissen möchten, ob das Verzeichnis existiert, suchen Sie die Fehlernummern für EEXIST.

1422480cookie-checkErstellen eines neuen Verzeichnisses in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy