C++ Windows文件名-如何检查文件名是否有效?
我想要一个函数,可能是其中一个,可以检查文件名是否有效。所谓有效,是指字符串中的字符是否都有效(例如,没有C++ Windows文件名-如何检查文件名是否有效?,c++,c,windows,winapi,filenames,C++,C,Windows,Winapi,Filenames,我想要一个函数,可能是其中一个,可以检查文件名是否有效。所谓有效,是指字符串中的字符是否都有效(例如,没有?,等)。但可悲的是,它没有任何功能。浏览网络,我发现了一些技术,没有一种是我喜欢的,也没有一种是可靠的 使用正则表达式检查文件名的内容 创建一个文件名,可能在系统的%TEMP%路径中。如果创建失败,则文件名(可能)无效。否则,它是有效的(因此,请删除该文件) 编写一个函数,检查文件名中是否存在无效字符(例如,?:*>) 函数的一种扩展形式是检查所有无效名称(如AUX、CON等),但这不
?
,
等)。但可悲的是,它没有任何功能。浏览网络,我发现了一些技术,没有一种是我喜欢的,也没有一种是可靠的
- 使用正则表达式检查文件名的内容
- 创建一个文件名,可能在系统的
路径中。如果创建失败,则文件名(可能)无效。否则,它是有效的(因此,请删除该文件)%TEMP%
- 编写一个函数,检查文件名中是否存在无效字符(例如,
)?:*>
AUX
、CON
等),但这不是问题(至少目前是这样)
是否有任何我可能遗漏的记录/未记录的函数,可以可靠地检查文件名(非路径名)是否有效。编辑:该函数现在已弃用,不再受支持。有关详细信息,请参阅链接页面末尾的要求
部分
谢谢康纳,谢谢你的邀请。对于其他读取器,函数名为。我使用它实现了以下内容:
bool IsLegalFileName(LPCWSTR filename)
{
WCHAR valid_invalid[MAX_PATH];
wcscpy_s(valid_invalid, filename);
int result = PathCleanupSpec(nullptr, valid_invalid);
// If return value is non-zero, or if 'valid_invalid'
// is modified, file-name is assumed invalid
return result == 0 && wcsicmp(valid_invalid, filename)==0;
}
有一个很好的小函数可以为您删除非法字符:从技术上讲,您无法判断文件名是否无效,而不是路径名,因为文件名的有效性也取决于底层文件系统。@gha.st,这是真的,但操作系统会知道。而且,我只询问操作系统提供的函数。谢谢@BLUEPIXY,但是
PathGetCharType
并不能解决问题。它适用于路径,但不(仅)适用于文件名。如果这为您解决了问题,您可以接受自己的答案。PathCleanupSpec
去掉表示要使用NTFS数据流的冒号,例如“file.ext:ads”
或“file.ext:ads:$data”
,用于名为“ads”的记录。“file.ext”
的默认值是匿名流“file.ext::$DATA”
。请注意,PathCleanupSpec被列为不推荐使用。它可能不存在于Windows的未来版本中。