Frage

Wissen Sie, warum bestimmte Dateien werden von diesem Programm nicht aufgeführt sind, auch wenn sie „regular“:

#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>

int main(void) {
  DIR *dh = opendir("./"); // directory handle
  struct dirent *file; // a 'directory entity' AKA file    
  struct stat info; // info about the file.
  while (file = readdir(dh)) {
    stat(file->d_name, &info);
    printf("note: file->d_name => %s\n", file->d_name);
    printf("note: info.st_mode => %i\n", info.st_mode);
    if (S_ISREG(info.st_mode))
      printf("REGULAR FILE FOUND! %s\n", file->d_name);
  }
  closedir(dh);

  return 0;
}

Nach dem dieses Programm ausgeführt wird, erhalte ich diese:

note: file->d_name => .
note: info.st_mode => 16877
note: file->d_name => ..
note: info.st_mode => 16832
note: file->d_name => .DS_Store
note: info.st_mode => 16832
note: file->d_name => ef efeff
note: info.st_mode => 16832
note: file->d_name => ffffff
note: info.st_mode => 16832
note: file->d_name => ffffff - copie
note: info.st_mode => 16832
note: file->d_name => folder
note: info.st_mode => 16832
note: file->d_name => printiie.tt
note: info.st_mode => 16832
note: file->d_name => test.c
note: info.st_mode => 33188
REGULAR FILE FOUND! test.c
note: file->d_name => z
note: info.st_mode => 33188
REGULAR FILE FOUND! z

Wie Sie sehen können, das Programm zu sehen ist nur zwei Dateien. Aber jede Datei ist regelmäßig, und es gibt nur einen Ordner.

Hier ist eine Kopie Vergangenheit des Shell-Befehl: $ ls -lai:

total 64
2421444 drwxr-xr-x  10 denis  staff   340 27 oct 22:19 .
2416789 drwxr-xr-x@ 28 denis  staff   952 27 oct 22:20 ..
2423204 -rw-r--r--@  1 denis  staff  6148 27 oct 21:41 .DS_Store
2423206 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ef efeff
2423183 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ffffff
2423216 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ffffff - copie
2423436 drwxr-xr-x   2 denis  staff    68 27 oct 21:57 folder
2423180 -rw-r--r--@  1 denis  staff    38 27 oct 21:32 printiie.tt
2423682 -rw-r--r--@  1 denis  staff   895 27 oct 19:57 test.c
2423208 -rwxr-xr-x@  1 denis  staff    34 27 oct 21:39 z

Ich möchte nur den Namen jeder Datei aufzulisten, aber ohne Verzeichnisse. Ich arbeite unter Mac OS X, aber ich glaube nicht, das ist der Grund des Problems sein könnte.

War es hilfreich?

Lösung

Es sieht aus wie die stat Funktion ist für einige der Dateien Fehler, so wird der info struct nicht aktualisiert und hat immer noch die Daten darin von "..". Ersetzen Sie diese Zeile mit:

if (stat(file->d_name, &info))
{
    printf("error: stat(%s): %s\n", file->d_name, strerror(errno));
    continue;
}

.. und Sie werden sehen, warum.

Andere Tipps

Ich hatte einmal jede yml Datei im Verzeichnis einschließlich Unterverzeichnisse auflisten. Es war auf Win XP: system("dir C:\Path\To\File\*.yml /B /S >> list.txt"); und dann würde ich analysieren list.txt alle die sie erhalten. Eine Linie war eine Datei. Einfach, aber nicht tragbar. dass auch war vor einiger Zeit -. Jetzt würde ich vielleicht boost versuchen

EDIT: Diese Antwort ist nicht über den Code, sondern:

  

Eigentlich nur würde Ich mag den Namen jeder Datei aufzulisten, aber ohne Verzeichnisse.

Wenn er den gleichen Ansatz wie ich nimmt, würde er sein Problem gelöst hat.

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