Windows路径中绝对禁止的字符是:、*、?、"、<、>、|、、/及ASCII控制字符(0x00–0x1F)和DEL(0x7F),而.和..是保留名,非非法字符。

Windows下哪些字符绝对不能出现在路径里
Windows文件系统(NTFS/FAT)对路径字符有硬性限制,:、*、?、"、、<code>>、|、、/ 这9个字符在任何位置(包括文件名、目录名、扩展名)都非法。另外,ASCII控制字符(0x00–0x1F)和DEL(0x7F)也不允许。. 和 .. 是保留名,但作为路径组件出现时不是“非法字符”,而是语义特殊——这点常被误判。
用std::string逐字符检查的可靠写法
别依赖正则或第三方库做基础校验——简单路径检查没必要引入复杂度。直接遍历字符串,对照非法字符表即可:
bool is_path_valid_on_windows(const std::string& path) {
static const std::string illegal = ":*?"<>|\/";
for (char c : path) {
if (c < 0x20 || c == 0x7F || illegal.find(c) != std::string::npos) {
return false;
}
}
return true;
}
注意:0x20是空格,它本身合法(Windows允许含空格路径),所以判断范围是 c (即0x00–0x1F),不包含空格;<code>0x7F单独排除。
- 不要用
std::isprint判断——它把DEL(0x7F)当作可打印字符,会漏判 - 路径中允许出现
+、=、[、]等符号,无需过滤 - 这个函数只检查字符合法性,不验证路径是否存在或长度是否超限(MAX_PATH=260)
Linux/macOS路径校验要谨慎得多
POSIX系统几乎不限制字符(除 <p>POSIX系统几乎不限制字符(除 <code>