C++ Auflisten von Verzechnissen und Dateien auf der Festplatte
-
Moin zusammen!
Ich überlege mir zur Zeit ein Programm zu schreiben, das Dateien und Ordner
auf der Festplatte (eventuell mit mehreren Partitionen) auflistet. Zur Zeit
habe ich folgenden Code:[cpp]
#include <windows.h>
#include <iostream>using namespace std;
int main()
{
WIN32_FIND_DATA FData;HANDLE hSearch = FindFirstFile("C:\*.*",&FData);
BOOL MoreFiles = FALSE;
int cnt_dir = 0, cnt_file = 0;if (hSearch == INVALID_HANDLE_VALUE) return -1;
do
{
// Ist das ein Ordner ?
if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
// Den Ordnernamen ausgeben
cout<<"(Ordner) "<<FData.cFileName<<endl;
cnt_dir++; // Ordnerzähler um 1 erhöhen
}// Wenn nicht
else
{
// Den Dateinamen ausgeben
cout<<"(Datei) "<<FData.cFileName<<endl;
cnt_file++; // Dateizähler um 1 erhöhen
}MoreFiles = FindNextFile(hSearch,&FData);
} while (MoreFiles);FindClose(hSearch);
cout<<endl<<"Insgesamt"<<endl
<<"Ordner: "<<cnt_dir<<endl
<<"Dateien: "<<cnt_file;cin.get();
return 0;
}Dazu habe ich einige Fragen:
1. Wie könnte man in der Zeile:
HANDLE hSearch = FindFirstFile("C:\*.*",&FData);
das "C:\*.*" durch eine Variable ändern, um damit in verscheidenen Ordner
zu springen?2. Gibt es andere bzw. elegantere Möglichkeit (Ordner und Dateien auf der Festplatte aufzulisten) als meine aufgezeigte?
Vielen Dank schon im Voraus!
P.S. Wenn dieses Thema schon bearbeitet wurden ist bzw. im falschen Forum liegt,
kann es gerne verschoben werden.
-
Du machst dir einfach ein std::string...
std::string Path = "C:\\*.*"; Path[ 0 ] = 'K'; //oder what ever HANDLE hSearch = FindFirstFile( Path.data( ), &FData );
Oder alternativ könntest du es mit einem char-array versuchen.
MfG
-
benutzer1234 schrieb:
1. Wie könnte man in der Zeile:
HANDLE hSearch = FindFirstFile("C:\*.*",&FData);
das "C:\*.*" durch eine Variable ändern, um damit in verscheidenen Ordner
zu springen?Indem du es durch eine Variable ersetzt.
2. Gibt es andere bzw. elegantere Möglichkeit (Ordner und Dateien auf der Festplatte aufzulisten) als meine aufgezeigte?
Boost Filesystem ist
1. halbwegs portabel, im Gegensatz zur Winapi.
2. eine C++-Bibliothek, so dass du nicht mit C-Methoden rumfrickeln brauchst.
-
Vielen Dank für die schnelle Antwort.
Nun habe ich es wie folgt in mein Programm geschrieben:
[cpp]
#include <windows.h>
#include <iostream>using namespace std;
WIN32_FIND_DATA FData;
BOOL MoreFiles = FALSE;
int cnt_dir = 0, cnt_file = 0;int main_while=0;
int i=0;
int main() {
string DIRECTORY_ARRAY[100];
DIRECTORY_ARRAY[0] = "C:\*.*";
std::string Path = DIRECTORY_ARRAY[0];while(main_while=1) {
HANDLE hSearch = FindFirstFile( Path.data( ), &FData );
if (hSearch == INVALID_HANDLE_VALUE) return -1;
do {
// Ist das ein Ordner ?
if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
// Den Ordnernamen ausgeben
cout<<"(Ordner) "<<FData.cFileName<<endl;// hier soll der Pfad zum auflisten der dateien und ordner verändert werden
cnt_dir++; // Ordnerzähler um 1 erhöhen
}
// Wenn nicht
else {
// Den Dateinamen ausgeben
cout<<"(Datei) "<<FData.cFileName<<endl;
cnt_file++; // Dateizähler um 1 erhöhen
}MoreFiles = FindNextFile(hSearch,&FData);
} while (MoreFiles);FindClose(hSearch);
cin.get();
} // while(main_while=1) {
return 0;
} // int main() {
Nun kam mir die Idee, das man alles Ordner und Unterordner auf dem Laufwerk
aufzulisten. Dazu sollen die in den Ordner vorhandenen Dateien ebenfalls
aufgelistet werden.Dazu könnte man doch die Variable der Ordnernamen speichern und sie PATH variable zusammen setzen oder nicht?
Vielen Dank für eure Antworten im Voraus!
P.S. Ich bin ein Neuling im C++ Programmieren....
-
Wenn das
while(main_while=1) {
in deinem Code steht, wird das Programm vermutlich etwas anders tun, als du denkst.
(Tipp: was ist der Unterschied zwischen = und ==?)
-
Mit Qt geht das ganz toll.
Qtmanni66 schrieb:
Wenn das
while(main_while=1) {
in deinem Code steht, wird das Programm vermutlich etwas anders tun, als du denkst.
(Tipp: was ist der Unterschied zwischen = und ==?)
Sowas erkennt man auch schneller, wenn man ordentlich schreibt:
while( main_while = 1 ) // Hier würde ich sofort erkennen, dass es eine Zuweisung ist
-
Vielen Dank für eure Antwort!
Wie könnte ich die Ordner- und Dateinamen in ein Array speichern
und sie nachFindClose(hSearch);
in meinem Code weiter verwenden?
Also ich hab die Variablen in ein Array übergeben und mit der
return Funktion dies versucht. Aber dies verweigert mein Compiler
mit dem Hinweis darauf, das die main Funktion als int ist.Wie schaffe ich es dies zu lösen?
Mit freundlichen Grüßen
-
benutzer1234 schrieb:
Also ich hab die Variablen in ein Array übergeben und mit der
return Funktion dies versucht. Aber dies verweigert mein Compiler
mit dem Hinweis darauf, das die main Funktion als int ist.SEUFZ
Zeig die Fehlermeldungen und den Code, der sie verursacht.
Offensichtlich schreibst du void main() o.ä.
Übrigens darfst du keine C-Style Arrays zurückgeben, da diese nicht durch einfache Zuweisung kopiert/initialisiert werden dürfen-