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

时间:2011-08-20 09:23:05

标签: c windows winapi path filenames

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

我需要验证文件名是否有效,我正在寻找一种简单的方法来完成它,而无需重新发明轮子。我正在使用C语言,但目标是Win32 API。

如果内置没有这样的功能,我将如何编写自己的功能? Windows是否遵循确定文件名有效性的通用算法或模式?

3 个答案:

答案 0 :(得分:6)

问题并非如此简单,因为它取决于您认为的“有效文件名”。

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

另一方面,如果您想要安全地播放,则应根据已为Win32名称链接的MSDN document指定的规则执行验证;我认为任何文件系统都不允许有比文件命名更严格的规则。另一方面,违反这些要求虽然可以得到内核本身的支持,但往往会给许多期望处理“传统”Win32路径的“普通”应用程序带来不良后果。

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

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

请注意,此功能在任何未来的Windows版本中都标记为“可修改或可移除”,尽管Microsoft策略通常是“任何能够使用公共标头的内容永远保持公开”。

答案 1 :(得分:0)

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

不,没有直接检查的功能。你必须写自己的功能。

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

您可以使用ctype.h中的某些功能帮助您自己(使用它们可以检查特定字符是否属于某些特定字符类):

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

答案 2 :(得分:-2)

此函数为您提供文件名的无效字符列表。由你来检查你的文件名不包含任何:

public static char[] Path.GetInvalidFileNameChars()

Docs here

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

编辑:Oooops!对不起,我以为你在.NET上。使用Reflector,这里的功能归结为:

'"', '<', '>', '|', 
'\0', '\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,...