2010-07-06 14 views
9

Estoy escribiendo un programa C++ en Linux (Ubuntu). Me gustaría eliminar el contenido de un directorio. puede ser archivos sueltos o subdirectorios.Cómo borrar los contenidos del directorio en C++ en Linux (básicamente, quiero hacer 'rm -rf <directorypath>/*'

Esencialmente, me gustaría hacer algo equivalente a

rm -rf <path-to-directory>/* 

puede sugerir la mejor manera de hacer esto en C++ junto con las cabeceras necesarias. ¿Es posible hacer esto con sys/stat.h o sys/types.h o sys/dir.h?!

Respuesta

-2
system ("rm -rf <path-to-directory>"); 
+1

grande enorme gigante riesgo de seguridad – sehe

+1

Eso no es un riesgo para la seguridad, como tampoco lo es la pregunta. OP solicitó el equivalente de 'rm -rf /*', que es prácticamente el mismo (aparte del hecho de que también eliminará el directorio de nivel superior). – paxdiablo

+0

Acabo de encontrar esta publicación. ¿Por qué es esto un riesgo de seguridad? – Laz

28

Utilice la función nftw() (Archivo árbol Walk), con la bandera FTW_DEPTH. Proporcionar una devolución de llamada que sólo llama remove() en el fichero pasado:

#define _XOPEN_SOURCE 500 
#include <stdio.h> 
#include <ftw.h> 
#include <unistd.h> 

int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) 
{ 
    int rv = remove(fpath); 

    if (rv) 
     perror(fpath); 

    return rv; 
} 

int rmrf(char *path) 
{ 
    return nftw(path, unlink_cb, 64, FTW_DEPTH | FTW_PHYS); 
} 

Si no desea eliminar el directorio base en sí, cambiar la función unlink_cb() para comprobar el nivel:

int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) 
{ 
    int rv; 

    if (ftwbuf->level == 0) 
     return 0; 

    rv = remove(fpath); 

    if (rv) 
     perror(fpath); 

    return rv; 
} 
+2

También debe agregar el indicador FTW_PHYS para manejar correctamente los enlaces simbólicos (lo que significa que no los sigue). – divegeek

+0

@divegeek: De acuerdo, editado. – caf

+0

¿Qué desempeña la función de "-f" en este código? ¿Qué pasa si solo quieres un "rm-r" regular? –

Cuestiones relacionadas