windows路径中绝对禁止的字符是、/、:、*、?、"、|,共7个,任何位置出现均导致系统调用失败;斜杠/虽可被转换但建议统一用;c++校验需显式遍历黑名单,宽字符路径须用wstring版本。

Windows下哪些字符绝对不能出现在文件路径里
Windows对路径字符有硬性限制,:、*、?、"、、<code>>、| 这7个字符在任何位置(包括文件名、目录名、盘符后)都非法,系统调用如 CreateFileA 会直接返回 ERROR_INVALID_NAME。斜杠 / 虽然在API层面可能被内部转换为 ,但混用容易引发逻辑歧义,建议统一用 。
如何用C++快速检查路径字符串是否含非法字符
别依赖 std::filesystem::path 的构造是否抛异常——它默认不校验非法字符,只做解析归一化。最稳妥的做法是显式遍历字符串并比对黑名单:
bool has_invalid_char(const std::string& path) {
static const std::string illegal = "\/:*?"|";
for (char c : path) {
if (illegal.find(c) != std::string::npos) {
return true;
}
}
return false;
}
注意点:
-
std::string版本只适用于窄字符路径;宽字符路径(std::wstring)需用std::wstring版本的黑名单和find - 不要忽略开头的
\——它可能是合法UNC路径(如\\server\share),但\后紧跟非法字符(如\*test)仍算违规 - 空格和点号(
.、..)本身合法,但结尾带空格或点会被系统自动截断,属于“语义非法”,需额外判断
Linux/macOS下路径字符限制其实更宽松
POSIX路径只禁止

