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.

¿Fue útil?

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 , no son realmente "envolturas de conveniencia". ¿Cuál es la comodidad en el prefijo funciones totalmente estándar y con un "g_"? (Y observe que digo esto aunque yo quien los presentó en el primer lugar.)

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.

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