findfirstfile dateiendung in unterverzeihnissen
-
Ich würde eher alle Dateien suchen und für EXE-Dateien eine entsprechende Sonderbehandlung ansetzen:
char* name=data.cFileName; if (!strcmp(name,".")&&!strcmp(name,"..") { if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { sprintf (szMsg, "%s\\%s", szChrStartPath, data.cFileName) ; fFindData (szMsg) ; } else if(strcmp(name+strlen(name)-4,".exe"){ // //hier gebe ich die Dateien in einem fenster aus // } }
-
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..