要递归删除一个目录,可以使用以下步骤:
- 使用built-in函数或者第三方库来获取目录下的所有文件和子目录
- 遍历所有子目录,并递归调用删除子目录的函数
- 遍历所有文件,并通过系统调用或者库函数将其删除
- 最终删除根目录
下面是一个标准的C++代码示例,调用了Windows API函数来实现删除目录的操作:
#include <iostream>
#include <Windows.h>
#include <tchar.h>
void deleteDirectory(LPCTSTR strFolderPath)
{
TCHAR szDir[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
_tcscpy_s(szDir, strFolderPath);
_tcscat_s(szDir, _T("\\*"));
// 在目录下搜索第一个文件并删除
hFind = FindFirstFile(szDir, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
return;
}
do
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (_tcscmp(FindFileData.cFileName, _T(".")) != 0 && _tcscmp(FindFileData.cFileName, _T("..")) != 0)
{
TCHAR szSubDir[MAX_PATH];
_stprintf_s(szSubDir, _T("%s\\%s"), strFolderPath, FindFileData.cFileName);
deleteDirectory(szSubDir);
}
}
else
{
TCHAR szFilePath[MAX_PATH];
_stprintf_s(szFilePath, _T("%s\\%s"), strFolderPath, FindFileData.cFileName);
DeleteFile(szFilePath);
}
} while (FindNextFile(hFind, &FindFileData) != 0);
FindClose(hFind); // 关闭搜索
RemoveDirectory(strFolderPath); // 删除当前目录
}
int main()
{
LPCTSTR strFolderPath = _T("C:\\TestFolder");
deleteDirectory(strFolderPath);
return 0;
}
上面的代码中,我们首先用 _tcscpy_s(szDir, strFolderPath);
将要删除的目标目录路径赋值给 szDir
,之后使用 _tcscat_s
将 *
添加到 szDir
之后,以便搜索文件和目录。然后我们使用函数 FindFirstFile
来获取目录下的第一个文件并删除它,并通过 FindNextFile
函数来获取下一个文件,直到找不到为止。在每一个文件的循环中,我们会判断这个文件是否是文件夹。如果是,我们把这个文件夹作为参数递归调用 deleteDirectory
函数并将它删除。如果不是,我们使用 DeleteFile
函数来删除它。循环结束后,我们最后删除整个目录。
下面是另一个示例,它需要递归地删除目录结构,同时忽略一些类型的文件(例如,.git
目录和 .gitignore
文件):
void recursiveDelete(boost::filesystem::path path,
const std::set<std::string>& ignoreFiles)
{
if (!boost::filesystem::exists(path))
{
return;
}
if (boost::filesystem::is_directory(path))
{
boost::filesystem::directory_iterator endIterator;
for (boost::filesystem::directory_iterator directoryIterator(path); directoryIterator != endIterator; ++directoryIterator)
{
if (boost::filesystem::is_directory(*directoryIterator))
{
recursiveDelete(directoryIterator->path(), ignoreFiles);
}
else
{
bool ignore = false;
for (auto ignoreFile : ignoreFiles)
{
if (ignoreFile == directoryIterator->path().filename().string())
{
ignore = true;
break;
}
}
if (!ignore)
{
boost::filesystem::remove(directoryIterator->path());
}
}
}
boost::filesystem::remove(path);
}
else if (boost::filesystem::is_regular_file(path))
{
boost::filesystem::remove(path);
}
}
在上面的代码中,我们首先检查目录是否存在到该路径并且是一个目录。如果不是,我们只需要删除该文件即可。否则,我们通过遍历目录结构来删除每个文件和子目录。
如果当前条目是一个子目录,我们用recursiveDelete
函数递归地删除它,并跳过忽略文件列表中列出的文件。在清除完所有文件和子目录之后,我们最终删除当前目录。
这个示例使用了 Boost C++ 库来获得文件系统的功能。注意,为了使用 Boost 中的文件系统模块,您需要相应的依赖/库。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++递归删除一个目录实例 - Python技术站