windows需定义_silence_cxx17_filesystem_deprecation_warning并包含,gcc需-link stdc++fs,clang(macos 10.15+)仅需-std=c++17;路径拼接用/而非+,遍历时启用skip_permission_denied选项,copy/remove操作需显式指定选项以保证跨平台一致性。

Windows 上用 std::filesystem 前必须加 #define _SILENCE_CXX17_FILESYSTEM_DEPRECATION_WARNING,否则 VS 2019+ 会报错;Linux/macOS 则需确认编译器支持 C++17 且链接 -lstdc++fs(GCC)或无需额外链接(Clang)。
如何启用 filesystem 并避免编译失败
VS 默认不开启 C++17 的 std::filesystem,即使项目设为 C++17 标准,仍可能触发弃用警告或链接错误。GCC 8+ 和 Clang 7+ 支持完整实现,但 GCC 需显式链接标准库扩展。
- VS:在包含头文件前加
#define _SILENCE_CXX17_FILESYSTEM_DEPRECATION_WARNING,再#include <filesystem></filesystem> - GCC:编译时加
-std=c++17 -lstdc++fs;若用 CMake,需target_link_libraries(your_target stdc++fs) - Clang(macOS):
-std=c++17足够,但注意 macOS 10.15+ 才完全支持std::filesystem - 检查是否可用:可先尝试
std::filesystem::exists("."),避免仅靠宏判断
path 对象的常见误用和路径拼接陷阱
std::filesystem::path 不是字符串容器,它的 / 操作符重载有语义——不是简单拼接,而是路径规范化。直接用 + 或 += 会导致意外结果。
- 正确拼接:用
/,如path{"a"} / "b" / "c.txt"→"a/b/c.txt"(自动处理分隔符) - 错误写法:
path{"a"} + "/b/c.txt"会产生"ab/c.txt"(+是字符串追加) - 相对路径转绝对路径:用
std::filesystem::absolute(p),别依赖p.is_absolute()后手动加current_path() - 注意
path::parent_path()返回的是逻辑父路径,对"a/../b"可能返回"a/..",建议先lexically_normal()
遍历目录时性能与异常处理的关键点
std::filesystem::directory_iterator 和 recursive_directory_iterator 默认不跳过符号链接、不捕获 I/O 错误,实际使用中极易崩溃或卡死。
本文档主要讲述的是Sencha touch 开发指南;主要介绍如何使用Sencha Touch为手持设备进行应用开发,主要是针对iPhone这样的高端手机,我们会通过一个详细的例子来介绍整个开发的流程。 Sencha Touch是专门为移动设备开发应用的Javascrt框架。通过Sencha Touch你可以创建非常像native app的web app,用户界面组件和数据管理全部基于HTML5和CSS3的web标准,全面兼容Android和Apple iOS。希望本文档会给有需要的朋友带来帮助;感兴趣的
立即学习“C++免费学习笔记(深入)”;
- 安全遍历:用
std::filesystem::directory_options::skip_permission_denied避免权限拒绝中断 - 符号链接处理:默认跟随链接,如需跳过,传入
std::filesystem::directory_options::follow_directory_symlink的反向配置(即不设该 flag) - 递归遍历时慎用
recursive_directory_iterator的默认构造——它会立即读取整个目录树,大目录下内存暴涨;改用带std::error_code&参数的构造函数并配合increment(ec)手动控制 - 不要在循环中反复调用
status(it->path()),改用it->symlink_status()或it->status()(已缓存)
copy、remove 等操作的原子性与跨平台差异
std::filesystem::copy 在 Windows 下默认不复制属性(如只读位),Linux 下则可能因权限模型不同导致 copy_options::skip_symlinks 行为不一致。
- 复制文件:明确指定选项,如
copy(src, dst, copy_options::overwrite_existing | copy_options::copy_symlinks) - 删除非空目录:用
remove_all(p),而非remove(p)(后者只删空目录) - 移动文件:
rename在同分区是原子的,跨分区则退化为 copy+remove,失败时原文件可能已删但目标未就绪——无事务保障,需自行校验 - Windows 特别注意:路径含
L"\?"前缀时,std::filesystem可能解析失败;建议统一用正斜杠或确保输入为常规路径
真正麻烦的不是 API 调用本身,而是不同系统对“路径存在”“权限足够”“符号链接是否可解”的定义差异——哪怕同一段代码,在 WSL、原生 Linux 和 Windows 上抛出的 std::filesystem::filesystem_error 的 code().value() 都可能不同。实操中建议把路径操作封装成带 fallback 的工具函数,而不是裸调标准接口。










