studio programacion móviles manejo libreria fichero estructura dirent directorios directorio desarrollo curso crear aplicaciones c recursion posix directory

programacion - En C, ¿cómo puedo llegar a un directorio específico?



manejo de directorios en c (3)

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?

Sé que parece 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.


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 parece que está en un sistema de estilo Unix / Linux. Si ese es el caso, entonces estás buscando la función opendir


El nombre del directorio es solo una cadena.

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

Sin embargo, quizás debería comenzar a pensar en nombres de archivo y pathes.

"usr / Documents / SourceCode" + "/../CS/Assignment4" es lo mismo que "usr / Documents / CS / Assignment4"; sin embargo, supongo que le falta el "/" inicial.

Bueno, no entiendo cómo puedes perderte 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 haya ayudado al menos un poco.

Angelo


Recorrer recursivamente un directorio en C es algo como esto:

Use opendir y readdir para listar las entradas del directorio. Probablemente no debería estar haciendo esto, pero estoy publicando un ejemplo de código completo (sin manejo de 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 */ }

Cuando trabaje con cada archivo, asegúrese de anteponer el dirpath a él (junto con una barra inclinada, si es necesario). También podría 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 usar la manipulación de cadenas para concatenar las rutas.

Para saber si una ruta es un directorio o no (y por lo tanto, si debería opendir() ), recomiendo usar lstat() lugar de stat() , ya que este último sigue los enlaces simbólicos, lo que significa que su recorrido de directorio podría quedar atrapado en un bucle y terminarás con algo como esta salida ctags .

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