是否有一个 Windows API 函数可以将字符串值传递给该函数,该函数将返回一个指示文件名是否有效的值?
我需要验证文件名是否有效,并且我正在寻找一种简单的方法来完成此操作,而无需重新发明轮子。我正在直接使用 C,但针对的是 Win32 API。
如果没有内置这样的函数,我将如何编写自己的函数? Windows 是否遵循确定文件名有效性的通用算法或模式?
问题没那么简单,因为这取决于您认为的“有效文件名”。
与 UNC 路径一起使用的 Windows API 将让您愉快地创建许多在正常路径中被视为无效的名称,因为带有前缀\\?\
您告诉 Windows API 仅将路径传送到文件系统驱动程序,而不执行任何检查;文件系统本身通常并不真正关心它用作文件名,一旦他们知道某个字符串只是文件名(即路径/名称分割已经完成),他们通常将其视为不透明的序列人物。
另一方面,如果你想安全起见,你应该根据指定的规则进行验证MSDN文档 http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx您已经链接了 Win32 名称;我不认为任何文件系统都可以有比文件命名更严格的规则。另一方面,尽管内核本身可以支持违反此类要求,但通常会给许多希望处理“传统”Win32 路径的“正常”应用程序带来严重的麻烦。
但是,在我看来,如果您必须立即创建文件,那么您可以做的最好的验证就是尝试实际创建/打开文件,让操作系统为您做这些工作,并准备好优雅地处理故障(GetLastError
应该返回ERROR_BAD_PATHNAME
)。这将检查您对创建此类文件的任何其他限制,例如您的应用程序具有适当的权限,路径不在只读介质上,...
如果由于某种原因这是不可能的,您可能会喜欢 shell 函数PathCleanupSpec http://msdn.microsoft.com/en-us/library/bb776472%28v=VS.85%29.aspx:提供请求的文件名和文件系统中必须创建的目录,此函数将删除所有无效字符(我不确定保留的 DOS 名称,它们没有在其文档中列出),从而创建路径“可能有效”并通知您是否进行了任何修改(因此您也只能将其用于验证)。
请注意,此函数被标记为“在任何未来的 Windows 版本中可修改或可删除”,尽管 Microsoft 的政策通常是“任何进入公共标头的内容都将永远保持公共状态”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)