Ordnerstruktur durchsuchen - Error



  • Guten Morgen,
    Ich hab mir ein Programm geschrieben welches in einem Ordner in alle Unterordner und Unterordner dieser Ordner springt usw. Es funktioniert, jedoch nicht immer.

    Wenn meine Ordner Struktur vom Basisordner (C:\Program Files\AAA\) aus so aussieht:

    -Acrobat 5.0
    - 123456
    - Help
    - Reader

    Es befindet sich nichts in den Ordnern.

    Bei dieser Ordner Struktur funktioniert es, soblad ich jedoch den Ordner "123456" in "1234567" unbenenne kommt eine Windows-Fehlermeldung und es geht nichtmehr weiter.

    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <dir.h>
    
    void search(void){
    
    	char Start[25];
    	getcwd(Start,256);
    	printf("\nStart = %s\n",Start);
        DIR *VERZEICHNIS;
        struct dirent *Folder;
        int Zaehler, Test;
    
        VERZEICHNIS = opendir(Start);
    
        for(Zaehler = 0; Folder = readdir(VERZEICHNIS); Zaehler++) {
             if(Zaehler < 2){continue;}
             Test = chdir(Folder->d_name);
             if(Test == -1){continue;}
             printf("%s\n",Folder->d_name);
             search();
        }
        closedir(VERZEICHNIS);
        chdir("..");
    }
    
    int main(void){
    
        chdir ("C:\\Program Files\\AAA\\");
        search();
    
        system("pause");
        return (0);
    }
    

    Würd mich freuen wenn mir jemand weiterhelfen kann. Ich programmiere nochnicht sehr lange in C und hab auch nach 1/2 Tag Fehlersuche nochnicht die Lösung gefunden.



  • char Start[25];
        getcwd(Start,256);
    

    Das ist recht waghalsig programmiert, getcwd darf start (das 25 Zeichen lang ist)
    gleich mal 256 Zeichen drüberbraten.

    for(Zaehler = 0; Folder = readdir(VERZEICHNIS); Zaehler++) {
             if(Zaehler < 2){continue;}
    

    Ich nehme mal an, du willst "." und ".." überlesen, mach das mal einfacher so:

    if ( *d_name == '.')
           continue;
    

    Zaehler kann dann komplett entfallen.

    ---

    Ich würde search() das zu scannende Verzeichnis mitgeben, in der Schleife dessen
    Namen neu bilden und dann search rekursiv aufrufen.

    Ein Beispiel:

    Search(
            char    *path
            )
    {
            char    *p, buf[256];
            DIR     *dp;
            struct  dirent *dir;
    
            sprintf( buf, "%s\\*.*", path);
            if ( (dp = opendir( buf)) != NULL){
                    for ( ; (dir = readdir( dp)) != NULL; ){
                            if ( *dir->d_name == '.')
                                    continue;
                            strlwr( dir->d_name);
                            if ( dir->d_attr & _A_SUBDIR){
                                    sprintf( buf, "%s\\%s", path, dir->d_name);
                                    Search( buf);
                            } else {
                                    printf( "\n%s\\%s", path, dir->d_name);
                            }
                    }
                    closedir( dp);
            }
    }
    

    (ungetestet, sollte aber gehen)



  • Scheppertreiber schrieb:

    Ich nehme mal an, du willst "." und ".." überlesen, mach das mal einfacher so:

    if ( *d_name == '.')
           continue;
    

    Damit überspringt man alle Verzeichnisse, deren Namen mit einem Punkt anfangen, nicht nur "." und "..".



  • Ok, aber er wird in Windows vielleicht mal 'ne .htaccess haben 🙂

    Dann mit strcmp(), egal.



  • Das ist recht waghalsig programmiert, getcwd darf start (das 25 Zeichen lang ist)
    gleich mal 256 Zeichen drüberbraten.

    Danke, das hät ich eigentlich auch merken müssen^^
    Jetzt funktioniert alles bestens.


Anmelden zum Antworten