VS2017 C++调用filesystem的remove_all报未定义错误咨询
问题根因
remove_all报错未定义由三个问题共同导致:
- Visual Studio 2017 对正式版C++17
<filesystem>库的支持存在版本差异:15.7版本之前的VS2017,文件系统相关实现全部放在std::experimental实验性命名空间下,没有直接暴露到std命名空间,直接调用全局命名空间下的remove_all自然找不到定义。 - 代码中路径写法存在语法错误:C++字符串中
\是转义字符起始标记,"C:\myfolder"会被编译器解析为包含非法转义序列的错误路径,根本无法指向目标文件夹。 - VS2017的IntelliSense代码提示模块存在已知缓存bug,也就是你提到的“修复后仍持续显示错误提示”的问题,这类报错不代表代码实际无法编译。
可行修复方案
方案1:适配VS2017版本调整filesystem写法
如果要继续用C++17的filesystem接口,按以下步骤修改:
- 替换头文件与命名空间声明,修正路径转义问题,代码参考:
#include <cstdio> // VS2017 低版本用实验性头文件 #include <experimental/filesystem> // 定义别名简化调用 namespace fs = std::experimental::filesystem; int main() { // 路径要么双写反斜杠转义,要么直接用正斜杠,两种写法都合法 fs::remove_all("C:\\myfolder"); // 等价写法:fs::remove_all("C:/myfolder"); printf("All items deleted!"); return 0; }
如果你的VS2017已经更新到15.7及以上版本,可以直接用正式命名空间,不需要experimental前缀:
#include <filesystem> namespace fs = std::filesystem;
- 调整项目编译配置:右键项目 -> 选择「属性」-> 「配置属性」-> 「常规」-> 「C++语言标准」,下拉选择
ISO C++17 标准 (/std:c++17),保存配置后重新编译。 - 如果改完配置代码可以正常编译运行,但编辑器还显示红色错误波浪线,直接删除项目根目录下的隐藏
.vs缓存文件夹,重启VS重新加载项目即可消除误报。
方案2:调用Windows原生API实现递归删除(兼容性最好)
如果不想折腾C版本兼容,可以直接调用Windows系统原生API实现文件夹递归删除,不需要依赖C17特性,VS2017默认配置即可编译运行,参考代码:
#include <windows.h> #include <cstdio> #include <string> BOOL DeleteAllInFolder(const std::wstring& folderPath) { std::wstring searchPattern = folderPath + L"\\*"; WIN32_FIND_DATAW findFileData; HANDLE hFind = FindFirstFileW(searchPattern.c_str(), &findFileData); if (hFind == INVALID_HANDLE_VALUE) return FALSE; do { const std::wstring itemName = findFileData.cFileName; // 跳过当前目录、上级目录标记 if (itemName == L"." || itemName == L"..") continue; const std::wstring itemFullPath = folderPath + L"\\" + itemName; if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 子目录递归删除 DeleteAllInFolder(itemFullPath); RemoveDirectoryW(itemFullPath.c_str()); } else { // 先去掉文件只读、隐藏属性再删除,避免删失败 SetFileAttributesW(itemFullPath.c_str(), FILE_ATTRIBUTE_NORMAL); DeleteFileW(itemFullPath.c_str()); } } while (FindNextFileW(hFind, &findFileData)); FindClose(hFind); // 如果要连目标文件夹本身一起删,保留下面这行;如果只删文件夹内的内容,注释掉这行 return RemoveDirectoryW(folderPath.c_str()); } int main() { if (DeleteAllInFolder(L"C:\\myfolder")) { printf("All items deleted!"); } else { printf("Delete failed, error code: %lu", GetLastError()); } return 0; }
这个实现还额外处理了只读、隐藏文件删除失败的问题,稳定性比直接调用filesystem::remove_all更好。
内容的提问来源于stack exchange,提问作者BroImcoolyCoder
相关产品推荐
相关产品推荐

