文件名中不允许使用的字符可通过Path.GetInvalidFileNameChars() 方法获得(但请注意文档中的“备注”部分)。对于reserved file names,我不知道获取它们的方法,因此您必须明确地与它们进行比较:
bool IsValidFileName(string name)
{
// empty names are not allowed
if (string.IsNullOrEmpty(name))
return false;
// check for characters that are not allowed in a file name
if (Path.GetInvalidFileNameChars().Any(c => name.Contains(c))
return false;
// check for reserved names
if (name.Equals(".", StringComparison.OrdinalIgnoreCase)
|| name.Equals("..", StringComparison.OrdinalIgnoreCase)
|| name.Equals("CON", StringComparison.OrdinalIgnoreCase)
|| name.Equals("PRN", StringComparison.OrdinalIgnoreCase)
|| name.Equals("AUX", StringComparison.OrdinalIgnoreCase)
|| name.Equals("NUL", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM1", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM2", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM3", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM4", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM5", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM6", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM7", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM8", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM9", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT1", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT2", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT3", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT4", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT5", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT6", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT7", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT8", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT9", StringComparison.OrdinalIgnoreCase))
return false;
return true;
}
查看路径名,可以使用类似的Path.GetInvalidPathChars()方法:
bool IsValidPathName(string name)
{
// empty path is not allowed
if (string.IsNullOrEmpty(name))
return false;
// check for characters that are not allowed in a path name
if (Path.GetInvalidPathChars().Any(c => name.Contains(c))
return false;
// check the file name part
if (!IsValidFileName(Path.GetFileName(name))
return false;
return true;
}