Pregunta

¿Sabe por qué ciertos archivos no están listados por este programa, incluso si son "normales"?:

#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;
}

Después de ejecutar este programa, obtengo esto:

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

Como puede ver, el programa solo ve dos archivos. Pero cada archivo es regular y solo hay una carpeta.

Aquí hay una copia del comando de shell: $ 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

Me gustaría enumerar el nombre de cada archivo, pero sin directorios. Trabajo en Mac OS X, pero no creo que esta pueda ser la razón del problema.

¿Fue útil?

Solución

Parece que la función stat está fallando para algunos de los archivos, por lo que la estructura info no se está actualizando y todavía tiene los datos de " .. " . Reemplace esa línea con:

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

..y verás por qué.

Otros consejos

Una vez tuve que enumerar todos los archivos yml en el directorio, incluidos los subdirectorios. Estaba en Win XP: system (" dir C: \ Path \ To \ File \ *. yml / B / S > > list.txt "); y luego analizaría list.txt para obtener todo los ellos. Una línea era un archivo. Fácil, pero no portátil. También eso fue hace algún tiempo, ahora tal vez intente impulsar.

EDITAR: Esta respuesta no se trata del código, sino de:

  

En realidad, me gustaría enumerar el nombre de cada archivo, pero sin directorios.

Si tomara el mismo enfoque que yo, tendría su problema resuelto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top