Um alle benötigten Ordner mit fopen zu erstellen

Lesezeit: 6 Minuten

Benutzer-Avatar
vico

Ich benutze fopen("aaa\bbb\ccc\myfile.txt","w") Ausgabedatei erstellen. Aber Ordner aaa, bbb und ccc existieren nicht. Was ist der beste Weg, um dieses Problem zu lösen? Gibt es eine Standardmethode zu fragen fopen() um alle benötigten Ordner zu erstellen?

  • Nein, fopen wird niemals Verzeichnisse erstellen. Es gibt bereits eine Frage mit guten Antworten zu einem erweiterten mkdir() Dadurch werden mehrere Ebenen erstellt, was dem entspricht, was Sie möchten. Sie müssten das mkdir auf mehreren Ebenen ausführen "aaa/bbb/ccc/" Dann ruf an fopen.

    Benutzer2404501

    20. Januar 2014 um 14:35 Uhr

  • Für Windows könnten Sie Informationen in diesem Beitrag verwenden stackoverflow.com/questions/2834737/…

    – Alex Jones

    20. Januar 2014 um 16:12 Uhr

  • Denken Sie daran, diese Backslashes im Allgemeinen zu verdoppeln. Hilft seitdem nicht bei dem Problem fopen() unterstützt einfach nicht das Erstellen von Verzeichnissen, aber wenn Die Verzeichnisse existierten, es wäre notwendig.

    – abschalten

    20. Januar 2014 um 16:17 Uhr

  • @WumpusQ.Wumbley Warum nicht antworten, anstatt einen Kommentar abzugeben? Der Autor könnte diese Frage also schließen.

    – Jérôme Pouiller

    23. März 2018 um 16:45 Uhr

  • Ordner sind ein GUI-Artefakt. Womit sich das Dateisystem befasst, ist Verzeichnisse und sie sind betriebssystemspezifisch. Standard C11 kennt keine Verzeichnisse

    – Basile Starynkevitch

    27. Mai 2018 um 6:56 Uhr

Wie andere angemerkt haben, gibt es keine plattformübergreifende Unterstützung für Verzeichnisse in der C-Standardbibliothek.

Soweit mein Verständnis reicht, fopen() und Freunde nicht einmal wissen oder sich darum kümmern, dass die /-es oder \-es in dem Pfad, den Sie ihnen geben, werden als Verzeichnistrennzeichen in den beiden heute verwendeten großen Betriebssystemfamilien verwendet.

Für eine plattformübergreifende Lösung z Single Verzeichniserstellung finden Sie in der Antwort von @dbush .

Sie können dies dann mit einer eigenen Funktion umschließen, die den vollständigen Datei-/Verzeichnispfad einschließlich aller übergeordneten Ordner übernimmt und alle erforderlichen übergeordneten Ordner (falls erforderlich) nacheinander erstellt.

Dazu müssen Sie einen Weg finden, jedes aufeinanderfolgende übergeordnete Verzeichnis aus Ihrem Dateipfad zu extrahieren, beginnend mit dem obersten/ganz linken Verzeichnis. Seien Sie vorsichtig mit dem Aufteilen von Zeichenfolgen in C, da Funktionen wie strtok() kann unsicher sein – möglicherweise sind Sie mit einem anderen Ansatz besser dran, um den Pfad in eine Liste der zu erstellenden Verzeichnisse umzuwandeln.

Möglicherweise müssen Sie auch Fälle handhaben, in denen bereits Verzeichnisse vorhanden sind oder in denen eine Datei in einem Pfad vorhanden ist, in dem Sie eines Ihrer Verzeichnisse platzieren möchten.

Benutzer-Avatar
Christian Almstrand

Hier ist eine weitere Alternative, die in einfachem C geschrieben ist und sich nicht auf strtok (was die übergebene Dateipfadzeichenfolge verstümmelt):

const char pathSeparator =
#ifdef _WIN32
  '\\';
#else
  "https://stackoverflow.com/";
#endif

// Given a file path, create all constituent directories if missing
void create_file_path_dirs(char *file_path) {
  char *dir_path = (char *) malloc(strlen(file_path) + 1);
  char *next_sep = strchr(file_path, pathSeparator);
  while (next_sep != NULL) {
    int dir_path_len = next_sep - file_path;
    memcpy(dir_path, file_path, dir_path_len);
    dir_path[dir_path_len] = '\0';
    mkdir(dir_path, S_IRWXU|S_IRWXG|S_IROTH);
    next_sep = strchr(next_sep + 1, pathSeparator);
  }
  free(dir_path);
}

Wenn Sie etwas C++ in Ihr Programm mischen können, ist die boost.filesystem-Bibliothek sehr praktisch Funktion um alle Zwischenverzeichnisse zu erstellen.

bool create_directories(const path& p);

Benutzer-Avatar
Robbie Hatley

Der C-Std. Lib. Funktionen zum Öffnen und Schreiben von Dateien, sie können zwar neue Dateien in bestehenden Verzeichnissen erstellen, aber keine neuen Verzeichnisse erstellen. Dazu schlage ich vor, die Funktion “mkdir” aus dem Header “sys/stat.h” und die Funktion “chdir” aus dem Header “unistd.h” zu verwenden.

Wenn Sie beispielsweise ein C-Programm schreiben, das auf Cygwin unter Windows 10 verwendet werden soll, würde so etwas funktionieren:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <error.h>
int main (void)
{
   FILE * fp;
   chdir("/cygdrive/d");
   if (mkdir("aaa", S_IRWXU|S_IRWXG|S_IROTH))
   {
      error(EXIT_FAILURE, errno, "Failed to create directory aaa");
   }
   chdir("aaa");
   if (mkdir("bbb", S_IRWXU|S_IRWXG|S_IROTH))
   {
      error(EXIT_FAILURE, errno, "Failed to create directory bbb");
   }
   chdir("bbb");
   if (mkdir("ccc", S_IRWXU|S_IRWXG|S_IROTH))
   {
      error(EXIT_FAILURE, errno, "Failed to create directory ccc");
   }
   chdir("ccc");
   fp=fopen("MyFile.txt", "w");
   if (!fp)
   {
      error(EXIT_FAILURE, errno, "Failed to open file for writing");
   }
   fprintf(fp, "Test.\n");
   fclose(fp);
   return 0;
}

Dadurch wird das Verzeichnis “D:\aaa\bbb\ccc” erstellt, dann eine Datei in diesem Verzeichnis namens “MyFile.txt” erstellt und dann “Test.\n” in diese Datei geschrieben.

Benutzer-Avatar
C Chorche

Wahrscheinlich nicht so elegant wie andere, aber:

system("mkdir aaa\\bbb\\ccc\\");
FILE * fp;
fp = fopen("aaa/bbb/ccc/myfile.txt","w");

Für den Linux-Einsatz -p Option und Schrägstriche.

Backslashes sollten drin sein system() Funktion, wenn Sie Windows verwenden

  • @andreee Stimmt, aber der Ordnerpfad sieht aus wie von Windows.

    – C Chorche

    24. Mai 2018 um 13:07 Uhr

  • Die umgekehrten Schrägstriche sollten maskiert werden und könnten durch Schrägstriche ersetzt werden.

    – Basile Starynkevitch

    27. Mai 2018 um 7:00 Uhr

  • Das vergessen, danke. Wenn der Benutzer Windows verwendet, gibt das Terminal einen Syntaxfehler zurück (und erstellt das Verzeichnis nicht), wenn Schrägstriche verwendet werden

    – C Chorche

    28. Mai 2018 um 7:52 Uhr

wenn Sie verwenden fopen() dann sollten Sie zuerst die übergeordneten Verzeichnisse erstellen.

Sie können dies einfach tun, indem Sie

system("mkdir -p aaa/bbb/ccc");
fopen("aaa/bbb/ccc/myfile.txt","w");

Vergessen Sie nicht, die Header-Datei einzuschließen <stdlib.h> in diesem Programm

  • @andreee Stimmt, aber der Ordnerpfad sieht aus wie von Windows.

    – C Chorche

    24. Mai 2018 um 13:07 Uhr

  • Die umgekehrten Schrägstriche sollten maskiert werden und könnten durch Schrägstriche ersetzt werden.

    – Basile Starynkevitch

    27. Mai 2018 um 7:00 Uhr

  • Das vergessen, danke. Wenn der Benutzer Windows verwendet, gibt das Terminal einen Syntaxfehler zurück (und erstellt das Verzeichnis nicht), wenn Schrägstriche verwendet werden

    – C Chorche

    28. Mai 2018 um 7:52 Uhr

fopen() wird verwendet, um Eingabeströme für Text- oder Binärdateien und nicht die Verzeichnisdateien zu öffnen. Wenn Sie möchten, dass Ihre Datei in einem Pfad geöffnet wird, der nicht vorhandene Verzeichnisse enthält, würde ich vorschlagen, dass Sie die Methode mkdir() der Header-Datei /sys/stat.h verwenden. Sobald Sie die Verzeichnisse bereit haben, können Sie fopen() verwenden, um die benötigte Datei zu öffnen (oder sie zu erstellen, falls sie noch nicht vorhanden ist). Dies ist der Ansatz, den ich verwendet habe, um eine Datei im a-Verzeichnis meines $HOME-Ordners zu erstellen: –

char* home_dir= getenv("HOME"); 
/*creates the directory with specified modes*/
mkdir(strcat(home_dir, "/make-a-note/"),S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
/*used the strcat() to generate the file-path.*/
personal_work=fopen(strcat(home_dir,"personal_work.txt"),"a+");

  • Verwenden Sie diesen Code nicht, die strcat() Aufruf ist böse: Er überläuft definitiv den Puffer, der den Inhalt der Umgebungsvariablen enthält. Dieses undefinierte Verhalten wird wahrscheinlich einige andere Umgebungsvariablen oder Schlimmeres zerstören.

    – Cmaster – Wiedereinsetzung von Monica

    14. März 2017 um 17:12 Uhr

1227670cookie-checkUm alle benötigten Ordner mit fopen zu erstellen

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

Privacy policy