C17 filesystem 实战路径拼接、目录遍历和错误处理手工拼路径字符串容易混淆斜杠、目录和文件名。C17 的 std::filesystem 提供 path 与一组文件系统操作让代码直接表达“路径”“文件大小”“遍历目录”等意图。最低标准C17。下面示例只读取当前目录不创建或删除文件。1. 用 path 拼接路径#includefilesystem#includeiostream#includesystem_errorintmain(){namespacefsstd::filesystem;fs::path filefs::path(logs)/app.log;std::coutfile.generic_string()\n;std::coutfile.filename().string()\n;std::coutfile.extension().string()\n;std::error_code ec;fs::directory_iteratorit(.,ec),end;if(ec){std::cerrec.message()\n;return1;}intshown0;while(it!endshown3){std::coutit-path().filename().string()\n;shown;it.increment(ec);if(ec){std::cerrec.message()\n;return1;}}}前三行分别是 logs/app.log、app.log、.log后面的目录项随运行位置而变化遍历顺序不保证固定。需要稳定展示时应先收集路径再排序。2. error_code 版本也要认真检查很多 filesystem 函数同时提供抛异常版本和接收 std::error_code 的版本。批量扫描文件时后者方便记录错误后继续处理。不能只检查迭代器构造遍历过程中权限或目录状态变化同样可能让 increment 失败。error_code 重载主要改变文件系统错误的报告方式不代表程序从此不可能因内存分配等原因抛异常。是否继续处理、跳过目录还是终止应由业务策略决定。3. exists 不是后续操作的保证“先 exists再打开”之间文件可能已经被其他进程移动或删除。应始终检查真正的打开、读取或写入结果exists 只能描述检查瞬间的状态不能充当安全保证。同理file_size 需要适用的文件对象并可能失败。对目录、权限不足的路径或不存在的文件不要把返回结果当成正常大小直接使用。4. 路径规范化和安全边界lexically_normal 进行词法整理不访问文件系统canonical 会解析实际存在的路径并处理符号链接两者不能混用。若用户输入路径简单拼接或消去“…”不足以保证它位于指定目录内符号链接与并发变化也需要考虑。跨平台时路径字符串编码与大小写规则也可能不同。接口内部尽量保持 path 类型只有与界面、协议或外部库交互时才做明确的编码转换。速记用 path 拼接用实际操作结果判断成功遍历和错误都按发生时处理不要把路径字符串看成可靠的访问权限边界。