windows下绝对不能出现在文件名中的字符是、:、"、/、、|、?、*及ascii控制字符(0x00–0x1f)和del(0x7f),系统调用会直接返回error_invalid_name。

Windows下哪些字符绝对不能出现在文件名里
Windows对文件名有明确禁止的、<code>>、:、"、/、、|、?、*,加上ASCII控制字符(0x00–0x1F)和DEL(0x7F)。这些不是“建议避免”,而是系统调用(如CreateFileA)会直接返回ERROR_INVALID_NAME。别指望std::filesystem::path构造时抛异常——它默认不校验,直到你真正create_directories或open才失败。
用std::isprint加白名单不如直接查黑名单
std::isprint在locale依赖下不可靠:比如某些中文locale里0xA0(non-breaking space)可能被判定为可打印,但它在NTFS上实际会导致ERROR_INVALID_NAME。更稳妥的做法是硬编码黑名单:
bool is_invalid_filename_char(char c) {
static const std::string forbidden = "
