C++ 如何删除C++中的文件夹?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/734717/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to delete a folder in C++?
提问by user88240
How can I delete a folder using C++?
如何使用 C++ 删除文件夹?
If no cross-platform way exists, then how to do it for the most-popular OSes - Windows, Linux, Mac, iOS, Android? Would a POSIX solution work for all of them?
如果不存在跨平台方式,那么对于最流行的操作系统——Windows、Linux、Mac、iOS、Android,如何做到这一点?POSIX 解决方案是否适用于所有人?
回答by Edouard A.
I strongly advise to use Boost.FileSystem.
我强烈建议使用 Boost.FileSystem。
http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm
http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm
In your case that would be
在你的情况下,这将是
回答by Roi Danton
With C++17 you can use std::filesystem
, in C++14 std::experimental::filesystem
is already available. Both allow the usage of filesystem::remove()
.
在 C++17 中你可以使用std::filesystem
,在 C++14std::experimental::filesystem
中已经可用。两者都允许使用filesystem::remove()
.
C++17:
C++17:
#include <filesystem>
std::filesystem::remove("myEmptyDirectoryOrFile"); // Deletes empty directories or single files.
std::filesystem::remove_all("myDirectory"); // Deletes one or more files recursively.
C++14:
C++14:
#include <experimental/filesystem>
std::experimental::filesystem::remove("myDirectory");
Note 1:
Those functions throw filesystem_errorin case of errors. If you want to avoid catching exceptions, use the overloaded variants with std::error_code
as second parameter. E.g.
注 1:如果出现错误,这些函数会抛出filesystem_error。如果您想避免捕获异常,请使用重载的变体std::error_code
作为第二个参数。例如
std::error_code errorCode;
if (!std::filesystem::remove("myEmptyDirectoryOrFile", errorCode)) {
std::cout << errorCode.message() << std::endl;
}
Note 2:
The conversion to std::filesystem::path
happens implicit from different encodings, so you can pass strings to filesystem::remove()
.
注意 2: 转换为std::filesystem::path
隐式发生在不同的编码中,因此您可以将字符串传递给filesystem::remove()
.
回答by hB0
Delete folder (sub_folders and files) in Windows (VisualC++) not using Shell APIs, this is the best working sample:
在不使用 Shell API 的 Windows (VisualC++) 中删除文件夹(子文件夹和文件),这是最好的工作示例:
#include <string>
#include <iostream>
#include <windows.h>
#include <conio.h>
int DeleteDirectory(const std::string &refcstrRootDirectory,
bool bDeleteSubdirectories = true)
{
bool bSubdirectory = false; // Flag, indicating whether
// subdirectories have been found
HANDLE hFile; // Handle to directory
std::string strFilePath; // Filepath
std::string strPattern; // Pattern
WIN32_FIND_DATA FileInformation; // File information
strPattern = refcstrRootDirectory + "\*.*";
hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
if(hFile != INVALID_HANDLE_VALUE)
{
do
{
if(FileInformation.cFileName[0] != '.')
{
strFilePath.erase();
strFilePath = refcstrRootDirectory + "\" + FileInformation.cFileName;
if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(bDeleteSubdirectories)
{
// Delete subdirectory
int iRC = DeleteDirectory(strFilePath, bDeleteSubdirectories);
if(iRC)
return iRC;
}
else
bSubdirectory = true;
}
else
{
// Set file attributes
if(::SetFileAttributes(strFilePath.c_str(),
FILE_ATTRIBUTE_NORMAL) == FALSE)
return ::GetLastError();
// Delete file
if(::DeleteFile(strFilePath.c_str()) == FALSE)
return ::GetLastError();
}
}
} while(::FindNextFile(hFile, &FileInformation) == TRUE);
// Close handle
::FindClose(hFile);
DWORD dwError = ::GetLastError();
if(dwError != ERROR_NO_MORE_FILES)
return dwError;
else
{
if(!bSubdirectory)
{
// Set directory attributes
if(::SetFileAttributes(refcstrRootDirectory.c_str(),
FILE_ATTRIBUTE_NORMAL) == FALSE)
return ::GetLastError();
// Delete directory
if(::RemoveDirectory(refcstrRootDirectory.c_str()) == FALSE)
return ::GetLastError();
}
}
}
return 0;
}
int main()
{
int iRC = 0;
std::string strDirectoryToDelete = "c:\mydir";
// Delete 'c:\mydir' without deleting the subdirectories
iRC = DeleteDirectory(strDirectoryToDelete, false);
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}
// Delete 'c:\mydir' and its subdirectories
iRC = DeleteDirectory(strDirectoryToDelete);
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}
// Wait for keystroke
_getch();
return 0;
}
Source: http://www.codeguru.com/forum/showthread.php?t=239271
回答by Vinay
The directory should be empty.
该目录应该是空的。
BOOL RemoveDirectory( LPCTSTR lpPathName );
回答by user4385463
void remove_dir(char *path)
{
struct dirent *entry = NULL;
DIR *dir = NULL;
dir = opendir(path);
while(entry = readdir(dir))
{
DIR *sub_dir = NULL;
FILE *file = NULL;
char abs_path[100] = {0};
if(*(entry->d_name) != '.')
{
sprintf(abs_path, "%s/%s", path, entry->d_name);
if(sub_dir = opendir(abs_path))
{
closedir(sub_dir);
remove_dir(abs_path);
}
else
{
if(file = fopen(abs_path, "r"))
{
fclose(file);
remove(abs_path);
}
}
}
}
remove(path);
}
回答by user1803888
Use SHFileOperation to remove the folder recursivelly
使用 SHFileOperation 递归删除文件夹
回答by TStamper
The directory must be empty and your program must have permissions to delete it
该目录必须为空,并且您的程序必须具有删除它的权限
but the function called rmdir will do it
但名为 rmdir 的函数会做到这一点
rmdir("C:/Documents and Settings/user/Desktop/itsme")
回答by Meysam
You can also try this if you are on linux:
如果你在 linux 上,你也可以试试这个:
system("rm -r path");
回答by Akash Kumar Singhal
This works for deleting all the directories and files within a directory.
这适用于删除目录中的所有目录和文件。
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
cout << "Enter the DirectoryName to Delete : ";
string directoryName;
cin >> directoryName;
string a = "rmdir /s /q " + directoryName;
char char_array[100];
strcpy(char_array, a.c_str()); //Converting a string into Character Array
system(char_array);
return 0;
}
回答by Svyatoslav Kovalev
For linux (I have fixed bugs in code above):
对于 linux(我在上面的代码中修复了错误):
void remove_dir(char *path)
{
struct dirent *entry = NULL;
DIR *dir = NULL;
dir = opendir(path);
while(entry = readdir(dir))
{
DIR *sub_dir = NULL;
FILE *file = NULL;
char* abs_path new char[256];
if ((*(entry->d_name) != '.') || ((strlen(entry->d_name) > 1) && (entry->d_name[1] != '.')))
{
sprintf(abs_path, "%s/%s", path, entry->d_name);
if(sub_dir = opendir(abs_path))
{
closedir(sub_dir);
remove_dir(abs_path);
}
else
{
if(file = fopen(abs_path, "r"))
{
fclose(file);
remove(abs_path);
}
}
}
delete[] abs_path;
}
remove(path);
}
For windows:
对于窗户:
void remove_dir(const wchar_t* folder)
{
std::wstring search_path = std::wstring(folder) + _T("/*.*");
std::wstring s_p = std::wstring(folder) + _T("/");
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (wcscmp(fd.cFileName, _T(".")) != 0 && wcscmp(fd.cFileName, _T("..")) != 0)
{
remove_dir((wchar_t*)(s_p + fd.cFileName).c_str());
}
}
else {
DeleteFile((s_p + fd.cFileName).c_str());
}
} while (::FindNextFile(hFind, &fd));
::FindClose(hFind);
_wrmdir(folder);
}
}