Después de indagar en diversos repositorios y sitios webs al concluir dimos con la solución que te compartimos ahora.
Solución:
Desea escribir una función (una función recursiva es más fácil, pero puede quedarse sin espacio de pila en directorios profundos) que enumere los elementos secundarios de un directorio. Si encuentra un niño que es un directorio, recurre a eso. De lo contrario, borra los archivos que contiene. Cuando haya terminado, el directorio está vacío y puede eliminarlo a través de syscall.
Para enumerar directorios en Unix, puede usar opendir()
, readdir()
, y closedir()
. Para eliminar tu uso rmdir()
en un directorio vacío (es decir, al final de su función, después de eliminar los hijos) y unlink()
en un archivo. Tenga en cuenta que en muchos sistemas d_type
miembro en struct dirent
no es apoyado; en estas plataformas, tendrá que utilizar stat()
y S_ISDIR(stat.st_mode)
para determinar si una ruta determinada es un directorio.
En Windows, usará FindFirstFile()
/FindNextFile()
enumerar, RemoveDirectory()
en directorios vacíos, y DeleteFile()
para eliminar archivos.
Aquí hay un ejemplo que podría funcionar en Unix (completamente sin probar):
int remove_directory(const char *path)
DIR *d = opendir(path);
size_t path_len = strlen(path);
int r = -1;
if (d)
struct dirent *p;
r = 0;
while (!r && (p=readdir(d)))
closedir(d);
if (!r)
r = rmdir(path);
return r;
Muchos unix
-como sistemas (Linux
, los BSD
arena OS X
, por lo menos) tienen el fts
funciones para el recorrido de directorio.
Para eliminar de forma recursiva un directorio, realice un recorrido en profundidad (sin los siguientes enlaces simbólicos) y elimine todos los archivos visitados:
int recursive_delete(const char *dir)
FTS_PHYSICAL
Si está utilizando un sistema operativo compatible con POSIX, puede utilizar nftw()
para recorrer el árbol de archivos y eliminar (elimina archivos o directorios). Si está en C ++ y su proyecto usa boost, no es una mala idea usar Boost.Filesystem como lo sugiere Manuel.
En el ejemplo de código a continuación, decidí no atravesar enlaces simbólicos y puntos de montaje (solo para evitar una gran eliminación :)):
#include
#include
#include
static int rmFiles(const char *pathname, const struct stat *sbuf, int type, struct FTW *ftwb)
if(remove(pathname) < 0)
perror("ERROR: remove");
return -1;
return 0;
int main(int argc, char *argv[])
if (argc != 2)
fprintf(stderr,"usage: %s pathn",argv[0]);
exit(1);
// Delete the directory and its contents by traversing the tree in reverse order, without crossing mount boundaries and symbolic links
if (nftw(argv[1], rmFiles,10, FTW_DEPTH
Aquí puedes ver las reseñas y valoraciones de los lectores
Te invitamos a añadir valor a nuestro contenido añadiendo tu veteranía en las aclaraciones.