me di cuenta que es muy vieja pregunta, pero la construcción de una gran respuesta de Demitri he creado una función recursiva que va a eliminar archivos en subcarpetas si se desea
tampoco algunos manejo de errores, en el sentido de que pasa de nuevo a errno. El encabezado de la función está escrito para el análisis por doxygen. Esta función funciona en los casos de ejemplos simples que utilicé y elimina las carpetas ocultas y los archivos ocultos.
espero que esto ayude a alguien más en el futuro
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#define SUCCESS_STAT 0
/**
* checks if a specific directory exists
* @param dir_path the path to check
* @return if the path exists
*/
bool dirExists(std::string dir_path)
{
struct stat sb;
if (stat(dir_path.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode))
return true;
else
return false;
}
/**
* deletes all the files in a folder (but not the folder itself). optionally
* this can traverse subfolders and delete all contents when recursive is true
* @param dirpath the directory to delete the contents of (can be full or
* relative path)
* @param recursive true = delete all files/folders in all subfolders
* false = delete only files in toplevel dir
* @return SUCCESS_STAT on success
* errno on failure, values can be from unlink or rmdir
* @note this does NOT delete the named directory, only its contents
*/
int DeleteFilesInDirectory(std::string dirpath, bool recursive)
{
if (dirpath.empty())
return SUCCESS_STAT;
DIR *theFolder = opendir(dirpath.c_str());
struct dirent *next_file;
char filepath[1024];
int ret_val;
if (theFolder == NULL)
return errno;
while ((next_file = readdir(theFolder)) != NULL)
{
// build the path for each file in the folder
sprintf(filepath, "%s/%s", dirpath.c_str(), next_file->d_name);
//we don't want to process the pointer to "this" or "parent" directory
if ((strcmp(next_file->d_name,"..") == 0) ||
(strcmp(next_file->d_name,".") == 0))
{
continue;
}
//dirExists will check if the "filepath" is a directory
if (dirExists(filepath))
{
if (!recursive)
//if we aren't recursively deleting in subfolders, skip this dir
continue;
ret_val = DeleteFilesInDirectory(filepath, recursive);
if (ret_val != SUCCESS_STAT)
{
closedir(theFolder);
return ret_val;
}
}
ret_val = remove(filepath);
//ENOENT occurs when i folder is empty, or is a dangling link, in
//which case we will say it was a success because the file is gone
if (ret_val != SUCCESS_STAT && ret_val != ENOENT)
{
closedir(theFolder);
return ret_val;
}
}
closedir(theFolder);
return SUCCESS_STAT;
}
'rm -r/tmp/*' borrará el contenido de la carpeta. – AusCBloke
Si desea invertir en el futuro, puede usar 'boost :: filesystem' para recorrer y eliminar cada uno. – chris
@AusCBloke: Uhm ...que eliminará todos los archivos * visibles * de la carpeta (es decir, aquellos a los que se extiende '*'), pero no eliminará ningún archivo que comience por '.' –