Windows文件名 - 如何检查文件名是否有效?

6
我需要一个函数,可能在 路径函数 中找到,用于检查文件名是否有效。有效意味着字符串中的字符都是有效的(例如没有 ?> 等)。但遗憾的是,没有这样的函数。在网上和 SO 上浏览了一些技术,但我没有喜欢或者找到可靠的方法。
  • 使用正则表达式来检查文件名的内容。
  • 创建一个文件名,可能在系统的 %TEMP% 路径中。如果创建失败,则该文件名(可能)无效。否则,它是有效的(因此,删除该文件)。
  • 编写一个函数,检查文件名中是否存在无效字符(例如 ?:*>

扩展这个函数的形式是检查所有无效名称(如 AUXCON 等),但这不是问题(至少现在不是)。

是否有任何已记录/未记录的函数可能会可靠地检查文件名(而不是路径名)是否有效?


5
这里有一个方便的小函数可以帮助您去除非法字符:http://msdn.microsoft.com/en-us/library/bb776472%28v=VS.85%29.aspx。 - Connor McGuinness
2
你无法从技术上确定一个文件名是否无效,因为它不是路径名,由于文件名的有效性也取决于底层文件系统。 - danielschemmel
1
@gha.st,这是正确的,但操作系统会知道它。而且,我只是在询问操作系统提供的函数。 - Ajay
@Ajay 你可以在一个操作系统上拥有(许多)不同的文件系统。事实上,你甚至可能会得到一些没有随操作系统一起提供的文件系统。 - danielschemmel
@gha.st 我只关心Windows上的NTFS。当太阳从西边升起时,我会重新考虑。 - Ajay
显示剩余4条评论
1个回答

4
编辑:函数 PathCleanupSpec 现已被弃用并不再受支持。有关详细信息,请参见链接页面末尾的 Requirements 部分。
感谢 Connor 提供这个函数。对于其他读者,该函数名称为 PathCleanupSpec。我使用它实现了以下功能:
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;
}

1
如果您的问题已经解决,您可以接受自己的答案。 - Jonathan Mee
1
PathCleanupSpec会剥离掉指示要使用的NTFS数据流的冒号,例如 "file.ext:ads""file.ext:ads:$DATA",以获取名为"ads"的记录。对于 "file.ext" 的默认值是匿名流 "file.ext::$DATA" - Eryk Sun
4
请注意,PathCleanupSpec被列为已弃用项。它可能在未来的Windows版本中不存在。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接