如何使用C++删除文件夹?
如果不存在跨平台的方法,那么如何为最流行的OSes - Windows,Linux,Mac,iOS,Android做跨平台呢?POSIX解决方案能解决所有这些问题吗?
发布于 2009-04-09 15:36:35
我强烈建议使用Boost.FileSystem。
http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm
在您的情况下,这将是
boost::filesystem::remove_all(yourPath)
发布于 2017-04-13 20:58:31
在C++17中,您可以使用 std::filesystem ,在C++14中 std::experimental::filesystem 已经可用。两者都允许使用 filesystem::remove() 。
std::filesystem
std::experimental::filesystem
filesystem::remove()
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:
#include <experimental/filesystem> std::experimental::filesystem::remove("myDirectory");
注1:这些函数在出现错误时抛出 filesystem_error 。如果您希望避免捕获异常,请使用重载的变体,并将 std::error_code 作为第二个参数。例如。
std::error_code
std::error_code errorCode; if (!std::filesystem::remove("myEmptyDirectoryOrFile", errorCode)) { std::cout << errorCode.message() << std::endl; }
注2:从不同的编码隐式地转换为 std::filesystem::path ,因此您可以将字符串传递给 filesystem::remove() 。
std::filesystem::path
发布于 2012-05-31 23:03:42
在Windows (VisualC++)中删除文件夹(sub_folders和文件)不使用外壳API,这是最好的工作示例:
#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) 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; bSubdirectory = true; // 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; 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;