windows下绝对不能出现在文件名中的字符共9个:、/、:、*、?、"、、|;此外con、prn等保留名需单独校验,不区分大小写。

Windows下哪些字符绝对不能出现在文件名里
Windows对文件名字符限制最严格,:、*、?、"、、<code>>、| 这7个ASCII字符在任何位置都非法,系统会直接拒绝创建或重命名。另外, 和 / 作为路径分隔符,也不能用作文件名组成部分;. 和 (空格)结尾会被系统自动截断,虽不报错但行为不可靠。
实际检测时,建议直接检查这9个字符:、/、:、*、?、"、、<code>>、|。注意:CON、AUX 等设备名属于保留名,需额外判断全名是否匹配(不区分大小写),但这类是名称黑名单,不是字符级问题。
C++里怎么快速检查非法字符
用 std::any_of 配合字符串遍历最简洁,避免手写循环出错:
bool has_invalid_char(const std::string& filename) {
static const std::string invalid_chars = "\/:*?"|";
return std::any_of(filename.begin(), filename.end(),
[&invalid_chars](char c) {
return invalid_chars.find(c) != std::string::npos;
});
}
注意点:
-
std::string::find返回std::string::npos表示未找到,别写成== -1 - 如果输入是
std::wstring(比如UTF-16路径),要改用std::wstring版本的invalid_chars,且确保所有字符宽窄一致 - 这个函数只查字符,不处理保留名(如
"CON.txt"),后者需单独用std::tolower+ 白名单比对
Linux/macOS要不要检查?检查什么
POSIX系统本身不限制大多数ASCII字符,但有2个硬性约束:<p>POSIX系统本身不限制大多数ASCII字符,但有2个硬性约束:<code>
