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.
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
Arnaud Le Blanc
Ansehen stat um zu prüfen, ob das Verzeichnis existiert,
#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
#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
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.
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.
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