2010-10-26 13 views
8

Tengo que hacer un programa donde necesito indexar los archivos en un directorio específico. He sacado la parte de indexación, pero lo que estoy teniendo problemas es cómo navegar al directorio. Por ejemplo, cuando empiece el programa, preguntará "¿Qué directorio le gustaría indexar?" Y luego la entrada sería "usr/Documents/CS/Assignment4", ¿cómo puedo acceder al directorio "Assignment4"? ? Sé que es necesaria la recursión, pero estoy muy confundido sobre cómo funcionan los directorios en C. Supongamos que mi archivo fuente está en "usr/Documents/SourceCode", ¿qué debo hacer para acceder a Assignment4?En C, ¿cómo puedo obtener un directorio específico?

Sé que parezco que quiero todas las respuestas, pero estoy completamente perdido en cuanto a cómo funcionan los directorios, y el libro que tengo apesta. Entonces, si todo lo que tienes es un enlace a un buen tutorial sobre esto, sería fantástico.

Estoy ejecutando Linux, Ubuntu para ser exactos. GCC es el compilador.

+0

Una solución simple puede ser ejecutar el programa en el directorio que desea indexar. Parece que estás escribiendo la utilidad del sistema 'ls-e':) – Marm0t

Respuesta

7

El lenguaje de programación C no tiene una noción de un sistema de archivos. Esta es, en cambio, una pregunta específica del sistema operativo.

Según el estilo del directorio en su pregunta, aunque parezca que está en un sistema estilo unix/linux. Si ese es el caso, entonces usted está buscando la función opendir

0

El nombre del directorio es sólo una cadena.

So opendir ("nombre de archivo"); hará posible leer el directorio "archivo".

Sin embargo, quizás deberías empezar a pensar en nombres de archivos y pathes.

"usr/Documents/SourceCode" + "/../CS/Assignment4" es lo mismo que "usr/Documents/CS/Assignment4", pero asumo que falta el "/" inicial.

Bueno, no entiendo cómo se puede perder cómo funcionan los directorios. Un directorio no es más que una "carpeta" en Windows o en Mac OS X. En resumen, un disco duro tiene un sistema de archivos y un sistema de archivos solo consta de carpetas/directorios que "contienen" archivos (y archivos especiales como conectores con nombre, etc. , esto no debería interesarte ahora mismo).

Espero que esto ayude al menos un poco.

Angelo

+0

Disculpa, dije eso mal. no se pierde en cuanto a cómo funcionan los directorios, solo cómo trabajar con ellos en C. Me gusta cómo se recorren los directorios, etc. – sx2000

1

recursiva atravesar un directorio en C o menos así:

Uso opendir y readdir para enumerar las entradas de directorio. Probablemente no debería estar haciendo esto, pero estoy publicando una muestra de código completo (manejo de errores sin errores) porque hay un montón de pequeñas cosas que debes hacer para asegurarte de que estás usando la API correctamente:

DIR   *dir; 
struct dirent *de; 
const char *name; 

dir = opendir(dirpath); 
if (dir == NULL) { 
    /* handle error */ 
} 

for (;;) { 
    errno = 0; 
    de = readdir(dir); 
    if (de == NULL) { 
     if (errno != 0) { 
      /* handle error */ 
     } else { 
      /* no more entries left */ 
      break; 
     } 
    } 

    /* name of file (prefix it with dirpath to get a usable file path) */ 
    name = de->d_name; 

    /* ignore . and .. */ 
    if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) 
     continue; 

    /* do something with the file */ 
} 

if (closedir(dir) != 0) { 
    /* handle error */ 
} 

Al trabajar con cada archivo, asegúrese de anteponer el dirpath a él (junto con una barra inclinada, si es necesario). También puede usar chdir para descender y ascender, pero introduce complicaciones en la práctica (por ejemplo, no puede atravesar dos directorios simultáneamente), así que personalmente recomiendo mantener el directorio de trabajo actual estacionario y utilizando la manipulación de cadenas para concatenar las rutas.

Para averiguar si un camino es un directorio o no (y por lo tanto, si debe opendir() ella), le recomiendo usar lstat() en lugar de stat(), ya que éste sigue los enlaces simbólicos, es decir, su recorrido de directorio podría quedar atrapado en un bucle y terminarás con algo like this ctags output.

Por supuesto, dado que la estructura del directorio es de naturaleza recursiva, la recursión desempeña un papel natural en el proceso transversal: realizar una llamada recursiva cuando una ruta hija es un directorio.

Cuestiones relacionadas