如何删除文件夹中的所有文件,但不要使用NIX标准库删除文件夹?

我正在尝试创build一个删除/ tmp文件夹的内容的程序,我在Linux上使用C / C ++。

system("exec rm -r /tmp") 

删除文件夹中的所有内容,但它也删除了我不想要的文件夹。

有什么办法通过某种forms的bash脚本来完成,通过system()调用。 或者有没有一种直接的方式,我可以在C / C ++中做到这一点?

我的问题是类似于这个,但即时通讯不在OS X … 如何删除文件夹中的所有文件,但不是文件夹本身?

Solutions Collecting From Web of "如何删除文件夹中的所有文件,但不要使用NIX标准库删除文件夹?"

在C / C ++中,你可以这样做:

 system("exec rm -r /tmp/*") 

在Bash中,你可以这样做:

 rm -r /tmp/* 

这将删除/ tmp中的所有内容,但不是/ tmp本身。

 #include <stdio.h> #include <dirent.h> int main() { // These are data types defined in the "dirent" header DIR *theFolder = opendir("path/of/folder"); struct dirent *next_file; char filepath[256]; while ( (next_file = readdir(theFolder)) != NULL ) { // build the path for each file in the folder sprintf(filepath, "%s/%s", "path/of/folder", next_file->d_name); remove(filepath); } closedir(theFolder); return 0; } 

你不想通过system()或类似的东西产生一个新的shell – 这是一个非常简单的开销,它使系统上有什么可用的不必要的假设(和依赖)。

你可以做

 system("exec find /tmp -mindepth 1 -exec rm {} ';'"); 

通过使用通配符*字符,您可以删除任何类型的扩展名的所有文件。

system("exec rm -r /tmp/*")

在C / C ++中,你可以使用(包括隐藏的目录):

 system("rm -r /tmp/* /tmp/.*"); system("find /tmp -mindepth 1 -delete"); 

但是如果“rm”或“find”工具不可用,那么最好使用'ftw'和'remove':

 #define _XOPEN_SOURCE 500 #include <ftw.h> static int remove_cb(const char *fpath, const struct stat *sb, int typeFlag, struct FTW *ftwbuf) { if (ftwbuf->level) remove(fpath); return 0; } int main(void) { nftw("./dir", remove_cb, 10, FTW_DEPTH); return 0; } 

我意识到这是一个非常古老的问题,但建立在Demitri伟大的答案我创建了一个函数,将递归删除子文件夹中的文件,如果需要

它也做了一些错误处理,因为它传递回errno。 函数头是为doxygen解析而写的。 此功能在我使用的简单示例中起作用,并删除隐藏文件夹和隐藏文件。

我希望这可以帮助别人在未来

 #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; } 

你可以使用nftw(3) 。 首先,通过收集要移除的文件路径集。 然后在第二遍中使用unlink (用于非目录)和rmdir(2)