windows路径非法字符包括: ” / | ? *、ASCII控制字符(0x00–0x1F)及结尾空格/点,设备名如CON/PRN/AUX/NUL(不区分大小写,含扩展名或尾部空格)也非法;std::Filesystem不校验字符合法性,需手动预检。

windows 下 c++ 判断路径是否含非法字符
Windows 对文件名和路径有明确的保留字符集,CreateFile、std::filesystem::create_directories 等调用失败时,往往不是因为权限或磁盘满,而是路径里混入了系统禁止使用的字符。这些字符不报“非法字符”错误,只返回 ERROR_INVALID_NAME 或抛出 std::filesystem::filesystem_error,排查起来很隐晦。
核心非法字符包括: > : " / | ? *,以及 ASCII 控制字符(0x00–0x1F)和结尾空格/点(如 "file. " 或 "con." 这类设备名变体)。
- 使用
std::filesystem::path时,path::String()或path::u8string()返回的字符串需逐字符检查,不能依赖path::has_filename()等接口判断合法性 - 注意
std::filesystem在 C++17 中不校验字符合法性,它只做路径解析;真正触发校验的是系统 API 调用(如exists()、create_directories()) - 设备名如
"CON"、"PRN"、"AUX"、"NUL"及其加扩展名或后缀空格的形式("CON.txt"、"CON ")也属于非法,需额外比对(不区分大小写)