findfirstfile dateiendung in unterverzeihnissen



  • CStoll schrieb:

    Ich würde eher alle Dateien suchen und für EXE-Dateien eine entsprechende Sonderbehandlung ansetzen

    diese Idee hate ich auch bereits, aber ich finde es muss doch möglich sein eine verschachtung der funktionen zu machen....

    hmmmm, ich wiess es auch nicht



  • keineIdee schrieb:

    diese Idee hate ich auch bereits, aber ich finde es muss doch möglich sein eine verschachtung der funktionen zu machen....

    Sicher. Mach einfach zwei Suchschleifen hintereinander. Eine mit "." für die Verzeichnisse und die Rekursion, eine mit "*.exe" für die Dateien.



  • Alternativ kannst du auch die Schleifen nacheinander ablaufen lassen - erst mit "." nach Unterverzeichnissen suchen, dahinter mit "*.exe" nach Programmdateien. (oder umgekehrt)



  • ich habe noch eine frage:

    wie finde ich die dateierweiterung von einer datei heraus (die sind unterschidlich lang)? gibt es eine funktion dafür?



  • PathFindExtension



  • CStoll, das sieht gefährlich aus: strcmp(name+strlen(name)-4,".exe")



  • @warning: dann eben "strcmp(strrchr(name,'.'),".exe")", falls dir damit wohler ist.

    @keineIdee: das einfachste ist wohl man: strrchr(name,'.') - findet das letzte ".xyz" in deinem Dateinamen (=Endung).



  • Am besten man macht 2 Suchfunktionen, eine für Ordner und die Andere für die Dateien.
    Das Ganze kann so aussehen:

    #include <windows.h>
    #include <stdio.h>
    
    void fFindFolder (char *, char *) ;
    void fFindFile (char *, char *) ;
    
    //hier der Aufruf aus der WinMain
    fFindFolder ("c:\\", "*.exe") ;
    
    //Funktion die Ordner sucht
    void fFindFolder (char *szStartPath, char *szErweiterung){
    	WIN32_FIND_DATA	data ;
    	HANDLE			handle ;
    	char			szBuffer[MAX_PATH],
    					szPath[MAX_PATH],
    					szEndung[MAX_PATH] ;
    	strcpy (szPath, szStartPath) ;
    	strcpy (szEndung, szErweiterung) ;
    	sprintf(szBuffer, "%s\\%s", szStartPath, "*.*") ;
    	handle = FindFirstFile (szBuffer, &data) ;
    	if (handle != INVALID_HANDLE_VALUE){
                    //und hier der Trick, die Funktion die die Dateien sucht wird hier aufgerufen
    		fFindFile (szPath, szEndung) ;
    		do{
    			if (!((data.cFileName[0] == '.') && ((data.cFileName[1] == '.' && data.cFileName[2] == 0) || data.cFileName[1] == 0 ))){
    				if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
    					sprintf(szBuffer, "%s\\%s", szStartPath, data.cFileName) ;
    					fFindFolder (szBuffer, szEndung, hParent) ;
    				}
    			}
    		}
    		while (FindNextFile (handle, &data)) ;
    	}
    	FindClose (handle) ;
    }
    
    //Funktion die Dateien sucht
    void fFindFile (char *szStartPath, char *szErweiterung){
    	WIN32_FIND_DATA	data ;
    	HANDLE			handle ;
    	char			szBuffer[MAX_PATH] ;
    	sprintf (szBuffer, "%s\\%s", szStartPath, szErweiterung) ;
    	handle = FindFirstFile (szBuffer, &data) ;
    	if (handle != INVALID_HANDLE_VALUE){
    		do{
    			if (!((data.cFileName[0] == '.') && ((data.cFileName[1] == '.' && data.cFileName[2] == 0) || data.cFileName[1] == 0 ))){
    				if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
    					// hier spuckt die Funktion die Dateien aus !!!!
                        // Der Name der Datei ist in data.cFileName gespeichert
    				}
    			}
    		}
    		while (FindNextFile (handle, &data)) ;
    	}
    	FindClose (handle) ;
    }
    


  • und um nach mehreren dateierweiterungen auf einmal zu suchen, muss man nur die Funktion fFindFile ändern:

    //im HauptTeil so die funktion Aufrufen:
    
    fFindFolder ("c:\\", "*.exe *.bat *.txt") ; //man kann belibig viele Erweiterungen übergeben... naja nicht mehr als in MAX_PATH rein passt
    
    // fFindFolder wie oben
    
    //und hier unsere erweiterte fFindFile Funktion
    void fFindFile (char *szStartPath, char *szErweiterungen){
    	WIN32_FIND_DATA	data ;
    	HANDLE			handle ;
    	char			szBuffer[MAX_PATH],
    					szEnd[MAX_PATH],
    					szEndungen[20][MAX_PATH] ;
    	int				x,
    					y,
    					iAnzahlEndungen ;
    	strcpy (szEnd, szErweiterungen) ;
    	for (x = 0, y = 0, iAnzahlEndungen = 0 ; x < (int) strlen (szEnd) ; x++){
    		if (szEnd[x] == ' '){
    			szEndungen[iAnzahlEndungen][y] = '\0' ;
    			iAnzahlEndungen++ ;
    			y = 0 ;
    		}
    		else{
    			szEndungen[iAnzahlEndungen][y] = szEnd[x] ;
    			y++ ;
    		}
    	}
    	szEndungen[iAnzahlEndungen][y] = '\0' ;
    	for (x = 0 ; x <= iAnzahlEndungen ; x++){
    		sprintf (szBuffer, "%s\\%s", szStartPath, szEndungen[x]) ;
    		handle = FindFirstFile (szBuffer, &data) ;
    		if (handle != INVALID_HANDLE_VALUE){
    			do{
    				if (!((data.cFileName[0] == '.') && ((data.cFileName[1] == '.' && data.cFileName[2] == 0) || data.cFileName[1]==0 ))){
    					if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
    				// hier spuckt die Funktion die Dateien aus !!!!
                        // Der Name der Datei ist in data.cFileName gespeichert
    							}
    				}
    			}
    			while (FindNextFile (handle, &data)) ;
    		}
    		FindClose (handle) ;
    	}
    }
    


  • Die Erweiterung bekommst du recht einfach mit:

    TCHAR szExt[_MAX_EXT];
    	_splitpath(
    		DATEINAME, 
    		NULL, 
    		NULL, 
    		NULL, 
    		szExt);
    
    	string erweiterung = (string)szExt;
    

    heraus..


Anmelden zum Antworten