2009-05-10 17 views
5

Aquí hay un código simple:Cómo ignorar los archivos ocultos con opendir y readdir en la biblioteca C

DIR* pd = opendir(xxxx); 
struct dirent *cur; 
while (cur = readdir(pd)) puts(cur->d_name); 

Lo que obtengo es una especie de desordenado: incluyendo punto (.), punto-punto (..) y el archivo nombres que terminan con ~.

Quiero hacer exactamente lo mismo que el comando ls. ¿Cómo soluciono esto, por favor?

Respuesta

15

Esto es normal. Si lo hace ls -a (que muestra todos los archivos, ls -A mostrará todos los archivos a excepción de . y ..), verá la misma salida.

. es un enlace que hace referencia al directorio en el que se encuentra: foo/bar/. es lo mismo es foo/bar.

.. es un enlace que hace referencia al directorio padre del directorio en el que se encuentra: foo/bar/.. es lo mismo que foo.

Cualquier otro archivo que comience con . son archivos ocultos (por convención, en realidad no se aplica por nada; esto es diferente de Windows, donde hay un atributo oculto real y oficial). Los archivos que terminan en ~ son probablemente archivos de respaldo creados por su editor de texto (de nuevo, esto es una convención, estos realmente podrían ser).

Si no desea mostrar este tipo de archivos, debe verificarlos explícitamente e ignorarlos.

+4

+1. Simplemente inserte el texto "if (* cur-> d_name! = '.')" Delante de "puts (...)" para obtener el comportamiento predeterminado de ls. –

+1

@j_random_hacker: si él no quiere los archivos de copia de seguridad, también tendría que verificar el seguimiento ~. – Zifre

+0

¡gracias a todos! Me gustaría elegir todas las respuestas si pudiera. ahora, he comprendido completamente este asunto. ¡gracias de nuevo! – fwoncn

1

Este comportamiento es exactamente como ls -a hace. Si desea filtrar, deberá hacerlo después del hecho.

6

La eliminación de archivos ocultos:

DIR* pd = opendir(xxxx); 
struct dirent *cur; 
while (cur = readdir(pd)) { 
    if (cur->d_name[0] != '.') { 
     puts(cur->d_name); 
    } 
} 

La eliminación de los archivos ocultos y que terminan en "~":

DIR* pd = opendir(xxxx); 
struct dirent *cur; 
while (cur = readdir(pd)) { 
    if (cur->d_name[0] != '.' && cur->d_name[strlen(cur->d_name)-1] != '~') { 
     puts(cur->d_name); 
    } 
} 
2

palillo de un if (cur->d_name[0] != '.') antes de procesar el nombre.

El estándar de archivos ocultos de UNIX es el punto inicial, que . y .. también coinciden.

El ~ final es el estándar para los archivos de copia de seguridad. Es un poco más trabajo ignorarlos, pero una CPU de varios gigahercios puede administrarlo. Use algo como if (cur->d_name[strlen(cur->d_name)-1] == '~')

Cuestiones relacionadas