[C] Verzeichnis auslesen HIlfe

Cusco

Erfahrenes Mitglied
Hi,

ich habe hier schon im Forum gesucht aber nix so recht gefunden. Ausser der unteren Routine, die ich an C anpassen wollte damit sie funktioniert. Sie läst sich auch Fehlerfrei Compilieren. Nur Passiert nix ausser das er dauert "." als Dir/Filename ausgibt und das xx mal. SIe funktioniert also nicht :( Worin liegt der Fehler? Das ganze soll unter Window (XP) funktionieren. Ich weiss leider nichtmal ob Windows die Dateinamen in ANSI oder UNICODE hält :(

Code:
void IterateDirectory(TCHAR *Dirname)
    {
      HANDLE hFile;
      WIN32_FIND_DATA FindData;
      TCHAR SearchName[1000];
        
      strcpy(SearchName,Dirname);
      strcat(SearchName,"/*");
	  
      hFile = FindFirstFileA(SearchName,&FindData);
      printf("Dir '%s'\n",SearchName);
     while(hFile != INVALID_HANDLE_VALUE)
      {
    	if(FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
    	  {IterateDirectory(FindData.cFileName);}
    	else
    	  {printf("%s\n",FindData.cFileName);}
		
	if(!FindNextFileA(hFile,&FindData))
    	  hFile = INVALID_HANDLE_VALUE;
      }
    }
 
Aiju hat gesagt.:
Kann es sein, dass du &hFile schreiben musst?

Nein dann passiert das selbe.:( An dieser Zeile habe ich übrigens nichts geändert die ist Orginal so aus dem Forum hier. Ich habe nur die "String" in TCHAR geändert und die copy/cat - Sachen hinzugefügt da sich der Compiler beschwerte.

Edit: Achja ich habe auch First/FindNextFile in FindNextFileA bzw FindFirstFileA geändert, da er dachte es soll UNICODE sein dabei ist mein ganzen Prog ANSI gehalten.
 
Zuletzt bearbeitet:
Hallo,

der Aufruf von FindFirstFile und der erste Aufruf von FindNextFile geben die Directory-Einträge "." und ".." zurück. Die kannst du ignorieren.

Bei Windows ist der Verzeichnistrenner ein Backslash, also besser so schreiben: strcat(SearchName,"\\*");

FindData.cFileName gibt nur das gefundene Unterverzeichnis, aber nicht den gesamten (zum Suchen benötigten) Pfad zurück. Dieser muss vorher erst noch zusammengebaut werden.
Code:
void IterateDirectory(TCHAR *Dirname)
{
    HANDLE hFile;
    WIN32_FIND_DATA FindData;
      
    TCHAR SearchName[MAX_PATH];
        
    strcpy(SearchName,Dirname);
    strcat(SearchName,"\\*");

    hFile = FindFirstFile(SearchName,&FindData);
    FindNextFile(hFile, &FindData);
    
    while( FindNextFile(hFile, &FindData) )
    {
        if( FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
        {
            strcpy(SearchName,Dirname);
            strcat(SearchName,"\\");
            strcat(SearchName,FindData.cFileName);
            
            IterateDirectory(SearchName);
        }
        else
        {
            printf("%s\n",FindData.cFileName);
        }
    }
}

Gruß
MCoder
 
Hi.
MCoder hat gesagt.:
Bei Windows ist der Verzeichnistrenner ein Backslash, also besser so schreiben: strcat(SearchName,"\\*");
Also das ist nicht unbedingt nötig da Windows ohne weiteres einen einfachen Slash auch als Verzeichnistrenner erkennt. Das Problem mit dem Backslash ist immer das er als Escape fungiert und man allzu leicht vergisst oder übersieht die Backslashes zu doppeln und wundert sich dann warum "c:\\temp\tfoo" nicht gefunden wird. Ich verwende unter Windows stets einen Slash und hatte damit keine Probleme und ich muß auch nicht den Code für Unix artige Systeme umschreiben.

Gruß
 
Hey Danke, klappt Super :)

Frage zum Directorysystem von Windows allgemein: Ist es immer so das die Dateien und Verzeichnisse gleich nach dem Alphabet geordnet sind, oder ist es so aufgebaut wie beim Amiga das das Dir in der Reihenfolge so aussieht, wie die Dateien gerade auf der Festplatte gelandet sind. Also eine extra sortierung nötig ist?
 
Hier mal ein Demobild (gif) von meinen Prog wo ich das Verzeichnis-Auslesen brauche :-)
Es ist natürlich erstmal nur ein DOS-Prog, da ich mich mit der WinAPI noch nicht auskenne :(
 

Anhänge

  • SN-ListDatei.gif
    SN-ListDatei.gif
    20,2 KB · Aufrufe: 80
Soweit mir bekannt ist gibt es keine Zusicherung das die Dateien in einer bestimmten Reihenfolge durchlaufen werden. Zudem gibt es unter Windows mehrere Dateisysteme.

/edit: Außerdem solltest du nicht vergessen auf Fehler zu prüfen (INVALID_HANDLE_VALUE) und das Handle auch wieder freizugeben wenn du es nicht mehr brauchst.

Gruß
 
Zuletzt bearbeitet:
deepthroat hat gesagt.:
Soweit mir bekannt ist gibt es keine Zusicherung das die Dateien in einer bestimmten Reihenfolge durchlaufen werden. Zudem gibt es unter Windows mehrere Dateisysteme.

/edit: Außerdem solltest du nicht vergessen auf Fehler zu prüfen (INVALID_HANDLE_VALUE) und das Handle auch wieder freizugeben wenn du es nicht mehr brauchst.

Gruß

OK geprüft wird jetzt, aber mit welcher Funktion gebe ich das HANDLE wider frei?
 
Zurück