Was ist der richtige Weg, um die Funktion stat () zu Test zu verwenden, wenn ein dirent ein Verzeichnis oder eine Datei ist?

StackOverflow https://stackoverflow.com/questions/1542763

  •  20-09-2019
  •  | 
  •  

Frage

Ich habe einige Probleme mit der 'if (S_IFDIR (stbuf.st_mode))' Linie. Ist dies der richtige Weg, um Test für ein Verzeichnis rekursiv in? Die Funktion im Moment ist es die richtige für 1 oder 2 Schleifen zu tun scheint und dann ausfällt und Zugriffsfehler.

Ich habe folgendes versucht, und wahrscheinlich mehr als die Bedingung.

S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)

Ich habe die ganze Funktion enthalten, weil ich das Problem an anderer Stelle sein könnte betroffen bin.

void getFolderContents(char *source, int temp){
    struct stat stbuf;
    int isDir;
    dirPnt = opendir(source);
    if(dirPnt != NULL){
        while(entry = readdir(dirPnt)){
            char *c = entry->d_name;
            if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){
            }
            else{
                stat(entry->d_name, &stbuf);
                printf("%i %i ", S_IFMT, stbuf.st_mode);
                if(S_IFDIR(stbuf.st_mode)){            //Test DIR or file
                printf("DIR: %s\n", entry->d_name);
                getFolderContents(entry->d_name, 0);
            }
            printf("FILE: %s\n", entry->d_name);
        }
    }
    closedir(dirPnt);
}
War es hilfreich?

Lösung

Ja, das ist richtig. Aber da Sie nie in das Verzeichnis wechseln, werden Sie es nicht finden.

Sie sich die folgende Verzeichnishierarchie:

 a
 |
 +- b
 |  |
 |  +- c
 ...

Ihr Code wird das aktuelle Verzeichnis scannen und finden „a“. Es wird feststellen, dass es ein Verzeichnis ist, und rufen Sie sich selbst rekursiv, und offen „a“ für das Lesen. Das funktioniert. Das Scan wird ein Verzeichnis mit dem Namen „b“ finden, aber versuchen, es zu öffnen, um den Eintrag Namen werden nur fehlschlagen, da der Weg ist nun „a / b“.

Ich empfehle Wechsel in das Verzeichnis (mit chdir()) vor dem Öffnen. Das bedeutet, dass können Sie einfach opendir("."). Bewahren Sie den alten Pfad, und chdir() wieder heraus, wenn dieses Niveau Rekursion erfolgt (nicht vor einem rekursiven Aufruf zu tun, tiefer zu gehen).

Andere Tipps

Wo ist gefallen hat? ist es eine lokale Variable? Ich kann nicht sehen, warum es würde segfault, kann aber sein, sollten Sie es sich um eine lokale Variable machen. Ein Beispiel, wo es Sie beißen sich hier:

                    if(S_IFDIR(stbuf.st_mode)){            //Test DIR or file
                            printf("DIR: %s\n", entry->d_name);
                            getFolderContents(entry->d_name, 0);
                    }
                    printf("FILE: %s\n", entry->d_name);

Die printf ist im Begriff, die falschen Namen zu drucken, so dass Sie wahrscheinlich ein anderes hier hinzufügen sollen.

Das gleiche gilt mit dirpnt. Wenn Sie von getFolderContents innerhalb der while-Schleife gehen, Sie am Ende readdir auf einem geschlossenen dirpoint Aufruf, die Sie sollen der Schleife raus.

Aber wie bahbar angegeben: Sie können nicht rekursiv und speichern temporäre Variable in der globalen Variable

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top