[c++] absoluter pfad mit leerzeichen

hellraiza000

Mitglied
Hi Leute!

Also ich hab folgendes Problem:

Ich will aus einem Pfad die ganzen Ordner auslesen und in eine Datei schreiben. Das funktioniert schon mal wunderbar, nur wenn der absolute Pfad Leerzeichen enthält (zB c:\stuff\a bis z\foo), dann schreibt mir das Programm gar nichts in die Datei! Wie kann ich das beheben?

Mein Code sieht folgendermaßen aus (wobei path der absolute Pfad ist)

Code:
    WIN32_FIND_DATA findData;
    HANDLE fhandle;
    char container[256];

    sprintf(container,"%s\\*.*",path);
    strcpy(container,path);
    strcat(container,"\\*");

    fhandle = FindFirstFile(container,&findData);
    FindNextFile(fhandle, &findData);
    
    while( FindNextFile(fhandle, &findData) ){
        if( findData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ){
		cout <<findData.cFileName <<endl;
		fputs(findData.cFileName, out);
		fputs("\n", out);
        }
   }
   FindClose(fhandle);


Danke schon mal im voraus! :)

greetz
hellraiza
 
Hi.

Also im Grunde machst du alles falsch, was man nur falsch machen kann.

1. Du benutzt sprintf um den Pfad + "\*.*" in die Variable container zu schreiben und überschreibst dann den Wert daraufhin wieder mit strcpy und strcat. Entscheide dich. Du solltest außerdem statt der unsicheren Funktionen lieber strncpy bzw. strncat benutzen.

2. Du prüfst nicht ob FindFirstFile den Wert INVALID_HANDLE zurückgegeben hat und benutzt einfach das Handle.

3. Du überspringst einfach immer die ersten beiden Verzeichniseinträge. Es ist nicht gesagt das das immer die Spezialeinträge "." und ".." sind.

4. findData.dwFileAttributes ist ein Bitfeld. D.h. das ein ganz bestimmtes Bit dieser Variablen angibt ob das aktuelle Objekt ein Verzeichnis ist oder nicht. Das dann auf Gleichheit mit FILE_ATTRIBUTE_DIRECTORY zu prüfen ist natürlich Unsinn. Der Test muß lauten:
C:
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

Es gab schon viele Beiträge zu diesem Thema. Such einfach mal nach FindFirstFile hier im Forum und du findest genügend Beispiele wo es besser gemacht wird.

Gruß
 
Zurück