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 weiter

    void 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. 😃


Log in to reply