在我的应用程序中,用户可以输入文件名。在处理之前,我想检查输入的String在Windows Vista上是否为有效的文件名。
最简单的方法是什么?
有效,我是合法的,不存在的
在我的应用程序中,用户可以输入文件名。在处理之前,我想检查输入的String在Windows Vista上是否为有效的文件名。
最简单的方法是什么?
有效,我是合法的,不存在的
Answers:
检查是否filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
和!File.Exists(Path.Combine(someFolder, filename))
"http://www.microsoft.com/"
通过测试,但不是有效的文件名,同上"::::"
反对GetInvalidFileNameChars()
:
var isValid = !string.IsNullOrEmpty(fileName) &&
fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
!File.Exists(Path.Combine(sourceFolder, fileName));
"http://www.microsoft.com/"
通过测试,但不是有效的文件名,同上"::::"
::::
被错误地认为是有效的。我已更正答案以指示< 0
而不是== 0
。
GetInvalidFileNameChars
,而GetInvalidPathChars
不像SLaks。只要仅测试文件名而不是路径文件名,就可以了。
GetInvalidFileNameChars
:-)
如果要创建文件,则应使用文件对话框指定目录路径。有简短的文件名非法字符列表。
判断文件名是否可接受的唯一真正可靠的方法是尝试使用它。许可是一团糟。
我用这个:
public static bool IsValidFileName(string name) {
if(string.IsNullOrWhiteSpace(name)) return false;
if(name.Length > 1 && name[1] == ':') {
if(name.Length < 4 || name.ToLower()[0] < 'a' || name.ToLower()[0] > 'z' || name[2] != '\\') return false;
name = name.Substring(3);
}
if(name.StartsWith("\\\\")) name = name.Substring(1);
if(name.EndsWith("\\") || !name.Trim().Equals(name) || name.Contains("\\\\") ||
name.IndexOfAny(Path.GetInvalidFileNameChars().Where(x=>x!='\\').ToArray()) >= 0) return false;
return true;
}
除保留名称,权限和长度限制外,应注意所有事项。这将接受相对和绝对文件名。
这只是一个想法。应该填充例外列表:
public static bool IsValidFilename(string filename)
{
try
{
File.OpenRead(filename).Close();
}
catch (ArgumentException) { return false; }
catch (Exception) { }
return true;
}