std::Filesystem::exists 不验证路径字符串合法性,仅检查解析后目标是否存在;含冗余分隔符或相对跳转的路径若可解析且目标存在则返回 true,语法错误路径可能抛出 filesystem_error。

std::filesystem::exists 不能检查路径有效性
直接说结论:std::filesystem::exists 的作用是判断「路径对应的位置是否存在文件或目录」,它**不验证路径字符串本身是否合法**。比如 "a/b//c/..////" 或 ".././foo.txt" 这类含冗余分隔符、相对跳转的路径,只要最终能解析到一个真实存在的目标,exists 就返回 true;但如果路径语法错误(如 windows 下含 、?、* 等非法字符),exists 通常会抛出 std::filesystem::filesystem_error 异常,而不是静默返回 false。
检查路径字符串合法性得靠 try/catch + exists
标准库没有独立函数校验路径格式。最实际的做法是调用 exists 并捕获异常——因为非法路径在底层系统调用(如 stat 或 GetFileAttributesW)阶段就会失败,filesystem 会将其包装为异常。
注意:这并非“检查有效性”的完美方案,但它是目前唯一可移植、无需平台特判的手段。
try { bool result = std::filesystem::exists("C:\some?path.txt"); // 含非法字符 // 如果没抛异常,说明路径语法被接受,且目标存在与否已知 } catch (const std::filesystem::filesystem_error& e) { // e.code() 可能是 std::errc::invalid_argument 或其他 // 表明路径字符串本身无法被系统解析 }
- 必须开启异常处理(编译器默认开启,但若用
-fno-exceptions则此法失效) - 不是所有非法路径都触发同一错误码;windows 对
?:、"、|敏感,Linux 对