Probleme beim rekursiven Suchen von Dateien mit WIN32_FIND_DATA !!!
-
Hallo,
kann mir jemand sagen warum dieser Code nicht rekursiv sucht ???
#include "iostream.h" #include "windows.h" #include "stdio.h" void FileFind(char* Pfad) { WIN32_FIND_DATA wfd; HANDLE fHandle = FindFirstFile(Pfad, &wfd); while(FindNextFile(fHandle, &wfd)) { cout << wfd.cFileName << "\n"; if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { char Pfad[MAX_PATH]; strcpy(Pfad, wfd.cFileName); strcat(Pfad, "\\*.*"); FileFind(Pfad); } } } void main() { char* Pfad = "C:\\*.*"; FileFind(Pfad); }
Ich habe schon viele Threads zum Suchen von Dateien gefunden, aber mein fehler konnte ich bis jetzt noch nicht lösen !
Danke und Mfg
:: NoName ::
-
Hallo,
ich weiss nicht wie sich die Windows-Directory-Funktionen verhalten. Aber unter
Unix/Linux muss man noch das Current- und Parentdirectory abfangen ("." und ".."),
da man sonst in einer Endlosschleife haengt.Schau doch mal in die Unix/Linux-FAQ, dort hab ich einen Beitrag zu diesem Thema
verfasst, evtl. hilft dir das hier weiter.mfg
v R
-
Hmm, nee irgenwie klappt das auch nicht !
-
Funktionen aus einem MFC-Programm:
long CProgrammstartDlg::CountFiles(CString pstrSourcePath) { BOOL bMore; WIN32_FIND_DATA wfd; HANDLE handle; CString szMask; CString szFullName; szMask = pstrSourcePath + "\\*.*"; //Suchmaske für FindFirstFile handle = ::FindFirstFile(szMask, &wfd); bMore = handle != INVALID_HANDLE_VALUE; while(bMore) { if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if( ((strcmp(wfd.cFileName, ".") != 0) && (strcmp(wfd.cFileName, "..") != 0)) ) // filename is a directory { szFullName = pstrSourcePath + "\\" + wfd.cFileName; CountFiles(szFullName); //Funktion rekursiv aufrufen }/*if*/ }/*if*/ else { CString SourceFile = pstrSourcePath + "\\" + wfd.cFileName; m_lNumFiles++; /* MSG msg; int Return = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); if (Return!=0) { TranslateMessage(&msg); DispatchMessage(&msg); } */ }/*else*/ bMore = ::FindNextFile(handle,&wfd); }/*while*/ if (handle!=INVALID_HANDLE_VALUE) ::FindClose(handle); return m_lNumFiles; }////////////////////Ende Member-Funktion BOOL CProgrammstartDlg::SnapshotFiles(CString pstrSourcePath, CString pstrTargetPath) { BOOL bMore; WIN32_FIND_DATA wfd; HANDLE handle; CString szMask; CString szFullName; CString szTargetName; CreateDirectory(pstrTargetPath, NULL); //Zielverzeichnis erstellen szMask = pstrSourcePath + "\\*.*"; //Suchmaske für FindFirstFile handle = ::FindFirstFile(szMask, &wfd); bMore = handle != INVALID_HANDLE_VALUE; while(bMore) { if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if( ((strcmp(wfd.cFileName, ".") != 0) && (strcmp(wfd.cFileName, "..") != 0)) ) // filename is a directory { szFullName = pstrSourcePath + "\\" + wfd.cFileName; szTargetName = pstrTargetPath + "\\" + wfd.cFileName; CreateDirectory(szTargetName, NULL); //Ziel-Unterverzeichnisse erstellen m_ctlStaticDirectory.SetWindowText(szFullName); //Verzeichnis anzeigen SnapshotFiles(szFullName, szTargetName); //Funktion rekursiv aufrufen }/*if*/ }/*if*/ else { CString SourceFile = pstrSourcePath + "\\" + wfd.cFileName; CString TargetFile = pstrTargetPath + "\\" + wfd.cFileName; m_ctlStaticFile.SetWindowText(wfd.cFileName); ::CopyFile(SourceFile, TargetFile, FALSE); //Datei wird kopiert (FALSE = überschreiben, falls vorhanden) UpdateWindow(); MSG msg; int Return = PeekMessage(&msg, NULL,0,0,PM_REMOVE); if(Return!=0) { TranslateMessage(&msg); DispatchMessage(&msg); } // Prozentanteil kopierter Dateien, lNumFiles entspricht 100%. m_iZaehler++; m_iProzent = (int)(m_iZaehler*100/m_lNumFiles); }/*else*/ bMore = ::FindNextFile(handle,&wfd); }/*while*/ if (handle!=INVALID_HANDLE_VALUE) { ::FindClose(handle); m_ctlStaticDirectory.SetWindowText(""); m_ctlStaticFile.SetWindowText("Alle Dateien wurden kopiert."); } return TRUE; }//Ende Member-Funktion SnapshotFiles
m_lNumFiles, m_iZaehler, m_iProzent sind in obigem Beispiel als Member-Variablen definiert (muss man anders lösen). Damit sollte es nach entsprechender Anpassung funktionieren.
-
eigentlich wollte ich meinen Code nicht vollkommen umstellen !
Mein Problem ist, dass ich nicht Pfad = wfd.cFileName + "\*.*"; schreiben kann, dann sagt der Compiler mir "cannot add two pointers" !
-
Hätte auch noch ned kleine Funktion hier.
Das meiste is aus der FAQ.
Vielleicht hilft's dir ja weitervoid scanDir(std::string Vz, bool Recursive = true) { using namespace std; HANDLE fHandle; WIN32_FIND_DATA wfd; // Erste Datei im Verzeichnis "c:\windows\desktop\" holen: // aufgrund von "alten Zeiten" ist das erste immer ein "." // kann also ignoriert werden. fHandle=FindFirstFile((Vz + "\\*").c_str(),&wfd); // Ergebnis Nummer 2 ist auch uninteressant (ist ".."): FindNextFile(fHandle,&wfd); while (FindNextFile(fHandle,&wfd)) { // Datei ist keine, sondern ein Verzeichnis... if( (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && Recursive) { // aktuelles Verzeichnis um den Unterordner erweitern, der grade gelesen wurde string str = Vz+"\\" + wfd.cFileName; // Unterverzeichnis scannen scanDir(str, Recursive); } else { cout<<wfd.cFileName<<endl; } } FindClose(fHandle); }
-
eigentlich wollte ich meinen Code nicht vollkommen umstellen !
dann eben nicht.