Saltar al contenido

Eliminar un directorio no vacío mediante programación en C o C ++

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 BSDarena 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *