C++14 (und frühere Versionen, insbesondere C++11) weiß nicht, über file systems und directories (noch) nicht. Für C++ 17, siehe file system library. Andernfalls ist Ihr Code betriebssystemspezifisch, aber Boost-Bibliothek hat einige file system support.
Ich gehe davon aus, dass Sie auf Linux oder einem POSIX-System laufen.
Ihr Programm verwendet nur einen externen Befehl (find(1)); Wenn Sie von einem solchen Befehl lesen möchten, können Sie popen(3) mit pclose
verwenden, dann brauchen Sie keine temporäre Datei. BTW, könnten Sie find . -type f -ls
verwenden.
Sie müssen jedoch keinen externen Befehl verwenden, und es ist sicherer (und schneller), dies zu vermeiden.
Umgangssprachlich könnte ein Dateiname ein Newline-Zeichen enthalten, und mit Ihrem Ansatz müssen Sie dies besonders beachten. Ein Dateiname könnte auch ein Tab-Zeichen (oder andere Steuerzeichen) enthalten und in diesem Fall würde sich find . -type f
speziell verhalten, und Sie müssten auch einen speziellen Fall eingeben. In der Praxis ist es extrem geschmacksarm und es ist sehr unwahrscheinlich, dass ein Newline- oder Tab-Zeichen in einem Dateinamen enthalten ist, und Sie könnten diese seltsamen Fälle vergessen.
Sie könnten nftw(3) verwenden. Sie könnten rekursiv opendir(3) & Schleife auf readdir(3) (und später closedir
) verwenden.
Sobald Sie einen Dateipfad haben, würden Sie stat(2) verwenden, die Datei-Metadaten zu erhalten, einschließlich der Größe (Feld st_size
). BTW die /bin/ls
und /usr/bin/find
Programme verwenden das.
Die readdir(3) Funktion gibt einen struct dirent
Zeiger zurück, der mit d_name
endet; Sie möchten wahrscheinlich die beiden Einträge für .
und ..
überspringen (also verwenden, um mit "."
und ".."
zu vergleichen, oder vergleichen Sie den harten Weg). Dann erstellen Sie einen vollständigen Dateipfad mithilfe der Verkettung von Zeichenfolgen. Sie könnten (in echtem C++) std::string verwenden oder Sie könnten snprintf(3) oder asprintf(3) dafür verwenden. Wenn Sie readdir
das aktuelle Verzeichnis .
können Sie stat(2) direkt auf d_name
Feld aufrufen.
BTW exit(-1)
ist falsch (und sicherlich schlechter Geschmack). Siehe exit(3). Eine viel besser lesbare Alternative ist exit(EXIT_FAILURE)
Mögliches Duplikat von [Mit C++ Filestreams (fstream), wie können Sie die Größe einer Datei bestimmen?] (Https://stackoverflow.com/questions/2409504/using-c-filestreams -stream-how-can-you-bestimmen-the-size-of-a-Datei) – vonludi
Sie legen sie in eine Textdatei und ...? Was willst du als nächstes tun? –
Nachdem ich diese Dateien in eine Textdatei geschrieben habe, möchte ich auch die Größe dieser Dateien ausgeben können. – notSoExperiencedCoder