windows路径中绝对禁止的字符是、:、"、/、、|、?、*,共9个(含/和),其中前7个在任何位置均导致api调用失败;/和虽为路径分隔符别名,但作为文件名字符仍非法。

Windows 下哪些字符绝对不能出现在路径里
Windows 文件系统对路径字符有硬性限制,:、*、?、"、、<code>>、| 这 7 个 ASCII 字符在任何位置(包括文件名、目录名、扩展名)都非法,哪怕只是出现在字符串里就可能让 CreateFileA、std::filesystem::path 构造或 std::ofstream 打开失败。注意:/ 在 Windows 上虽被当作路径分隔符别名(兼容 Unix 风格),但它本身不是非法字符;真正危险的是上面那组“保留字符”。
用 std::filesystem::path 判断是否合法不靠谱
std::filesystem::path 构造函数不会主动校验非法字符——它只是做字符串切分和规范化,比如把 "a/bc" 归一为内部表示。即使你传入含 或 <code>? 的字符串,构造也不会抛异常,后续调用 .string() 或 .generic_string() 仍会原样返回。所以不能靠“没崩溃”来判断合法。
实操建议:
- 手动扫描字符串中是否包含
':', '*', '?', '"', '', '|' - 注意:控制字符(ASCII 0–31)也非法,但实际输入中极少出现,如需严格检查可补充
std::iscntrl - 不要依赖
std::filesystem::exists()或is_regular_file()反向验证——它们只查是否存在,不报字符错误
跨平台判断要区分逻辑和实际约束
Linux/macOS 对路径字符限制极宽松:除 <p>Linux/macOS 对路径字符限制极宽松:除 <code>
