Cómo caminar un directorio en C
-
19-09-2019 - |
Pregunta
Estoy utilizando simplista en mi solicitud, y veo que hay envolturas de conveniencia en labia para remove
de C, unlink
y rmdir
. Pero éstas sólo funcionan en un único archivo o directorio a la vez.
Por lo que yo puedo ver, ni el estándar de C ni simplista incluyen cualquier tipo de funcionalidad de directorio paseo recursiva. Tampoco veo ninguna manera específica para eliminar un árbol de directorios a la vez, al igual que con rm -rf
.
Por qué estoy haciendo esto, no estoy preocupado por ningún tipo de complicaciones como permisos, el enlace simbólico a una copia de seguridad del árbol (bucle), o cualquier cosa que pudiera descartar una muy ingenuo aplicación ... así que no soy reacio a escribir mi propia función para ello.
Sin embargo, estoy ansioso por ver si esta funcionalidad es por ahí en algún lugar del GTK bibliotecas estándar o simplista (o de alguna otra biblioteca de C fácilmente reutilizados) ya y simplemente no han tropezado con él. Googlear este tema genera una gran cantidad de pistas falsas.
De lo contrario mi plan es utilizar este tipo de algoritmo:
dir_walk(char* path, void* callback(char*) {
if(is_dir(path) && has_entries(path)) {
entries = get_entries(path);
for(entry in intries) { dir_walk(entry, callback); }
}
else { callback(path) }
}
dir_walk("/home/user/trash", remove);
Obviamente me gustaría construir de alguna gestión de errores y similares para abortar el proceso tan pronto como se detecta un error fatal.
Solución
Puede utilizar GFileEnumerator si quiere hacerlo con mucha labia .
Otros consejos
¿Has mirado en <dirent.h>
? Aparentemente, este pertenece a la especificación POSIX, que debería formar parte de la biblioteca estándar de la mayoría, si no todos los compiladores de C. Véase, por ejemplo esta referencia <dirent.h>
( Single UNIX especificaciones de la versión 2 por Open Group) .
P.S , antes de que alguien comenta sobre esto: No, esto no ofrece recorrido de directorio recursivo. Pero entonces creo que esto será más eficaz si el desarrollador; requisitos pueden variar mucho, por lo que una talla única para todos función de recorrido recursivo tendrían que ser muy poderoso. (Ej .: ¿Son enlaces simbólicos seguidos? En caso de recursividad profundidad limitarse? Etc.)
Varias plataformas incluyen ftw y nftw: "recorrido del árbol (nuevo) archivo". Comprobación de la página del manual en un iMac muestra que estos son herencia, y los nuevos usuarios prefiera FTS. Portabilidad puede ser un problema con cualquiera de estas opciones.
bibliotecas estándar de C están destinados a proporcionar funcionalidad primitiva. Lo que estamos hablando es de comportamiento compuesto. Se puede implementar fácilmente con las funciones de bajo nivel presentes en su API de elección - echar un vistazo a este tutorial .
Tenga en cuenta que los "envoltorios de conveniencia" que mencionan a remove (), desvincular () y rmdir (), suponiendo que se refiere a los declarados en
La única razón existen estas envolturas es para cuestiones de nombres de archivos en Windows, donde estos envoltorios en realidad consisten en código real; toman argumentos de nombre de archivo en Unicode, codificados en UTF-8. Las correspondientes funciones de biblioteca "articulo" Microsoft C tienen nombres de archivo de página de códigos del sistema.
Si usted no está escribiendo código específicamente destinado a ser portátil a Windows, no hay razón para usar la g_remove (), etc envoltorios.