2017-06-01 8 views
-1

Ich bin neu in C++ - Programmierung, und ich versuche, Datei lesen und schreiben zu üben. Ich versuche, die Größe aller Dateien des aktuellen Verzeichnisses zu ermitteln. Nachdem ich die Namen der Dateien im aktuellen Verzeichnis abgerufen habe, platziere ich sie in einer Textdatei. So, jetzt bin ich fest und weiß nicht, wohin ich von hier aus gehen soll.C++: Größe aller Dateien im aktuellen Verzeichnis

#include <iostream> 
#include <fstream> 
#include <algorithm> 

using namespace std; 

       // FILE FUNCTION 

void fileStuff(){ 

} 

       // MAIN FUNCTION 

int main(int argc, char const *argv[]) 
{ 
// ERROR CHECKING 
if(argc != 3){ // IF USER DOESN'T TYPE ./nameOfFile, AND THE OTHER REQUIRED ARGUMENTS. 

    cout << "Incorrect. Try Again" << endl; 
    exit(-1); 
} 

ifstream file; 
string fileContents; 

system("find . -type f > temp.txt"); 

file.open("temp.txt"); 

if (!file){ 

    cout << "Unable to open file: temp.txt" << endl; 
    exit(-1); 
} 
while(file){ 

    getline(file, fileContents); 
    cout << fileContents << endl; 
} 

file.close(); 
return 0; 
} 
+2

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

+0

Sie legen sie in eine Textdatei und ...? Was willst du als nächstes tun? –

+0

Nachdem ich diese Dateien in eine Textdatei geschrieben habe, möchte ich auch die Größe dieser Dateien ausgeben können. – notSoExperiencedCoder

Antwort

2

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)

+1

[Boost Beispiel] (http://boost.2283326.n4.nabble.com/Directory-size-via-boost-filesystem-problem-td2563938.html) – MSalters

Verwandte Themen