如何在Windows中验证文件是否为名称有效?

有没有一个Windows API函数,我可以传递一个字符串值,将返回一个值,指示文件名是否有效?

我需要验证一个文件名是否有效,并且我正在寻找一种简单的方法来做到这一点,而无需重新发明轮子。 我正在直接使用C语言,但针对的是Win32 API。

如果没有内置的这种功能,我将如何去写自己的? Windows是否有一个通用算法或模式来确定文件名有效性?


问题并不那么简单,因为它取决于您认为的“有效文件名”。

与UNC路径一起使用的Windows API可让您愉快地创建大量在正常路径内无效的名称,因为使用前缀?您告诉Windows API仅将路径传递到文件系统驱动程序,而无需执行任何检查; 文件系统本身通常并不关心它作为文件名的用途,一旦他们知道某个字符串只是文件名(即路径/名称已经完成),它们通常将它视为一个不透明的序列字符。

另一方面,如果你想安全地玩,你应该根据你已经链接到Win32名称的MSDN文档指定的规则来执行验证; 我认为任何文件系统都不允许有比这些文件命名更严格的规则。 另一方面,违反这些要求虽然可以得到内核本身的支持,但却经常给很多“常规”应用程序带来麻烦,这些应用程序希望处理“传统”Win32路径。

但是,在我看来,如果你必须立即创建文件,那么你可以做的最好的验证是尝试实际创建/打开文件,让操作系统为你做这样的工作,并准备妥善地处理失败GetLastError应该返回ERROR_BAD_PATHNAME )。 这将检查您在创建此类文件时是否存在其他限制,例如您的应用程序具有适当的权限,路径不在只读介质上,...

如果出于某种原因,这是不可能的,您可能会喜欢shell函数PathCleanupSpec :提供所需的文件名和文件系统中必须创建的目录,此函数将删除所有无效字符(我不知道保留的DOS名称,它们没有在其文档中列出),使路径“可能有效”并通知您是否进行了任何修改(因此您可以使用它也仅用于验证)。

请注意,此功能在未来的Windows版本中被标记为“可修改或可移除的”,尽管微软的政策一般是“任何让公共头部通过的方式都将永远保持公开”。


如果你在检查文件名是否有效,“这个文件可以这样命名吗?” :

不,没有功能可以直接检查。 你将不得不写你自己的功能。

但是,如果您知道什么是有效的文件名(有效的文件名现在包含以下任一项: / : * ? " < > | ),那就不应该是这样的问题。

你也许可以用ctype.h一些函数来帮助你自己(用它们你可以检查一个特定的字符是否属于某些特定的字符类):

http://www.cplusplus.com/reference/clibrary/cctype/


这个函数给你一个文件名的无效字符列表。 由你来检查你的文件名不包含任何内容:

public static char[] Path.GetInvalidFileNameChars()

文档在这里。

请注意,如果您要验证目录名称,则应使用GetInvalidPathChars()

编辑:哦! 对不起,我以为你在使用.NET。 使用反射器,这是什么功能归结为:

'"', '<', '>', '|', 
'', 'x0001', 'x0002', 'x0003', 'x0004', 'x0005', 'x0006', 
'a', 'b', 't', 'n', 'v', 'f', 'r', 
'x000e', 'x000f', 'x0010', 'x0011', 'x0012', 'x0013', 'x0014', 'x0015', 
'x0016', 'x0017', 'x0018', 'x0019', 'x001a', 'x001b', 'x001c', 'x001d', 
'x001e', 'x001f', 
':', '*', '?', '', '/'

请注意,此外还有保留名称,如prn, con, com1, com2,... , lpt1, lpt2,...

链接地址: http://www.djcxy.com/p/54631.html

上一篇: How can I validate if a file is name valid in Windows?

下一篇: How can I read the response from a web request when the Status is not 200?