C# 检查任意字符串是否为有效文件名的最简单方法

C# 检查任意字符串是否为有效文件名的最简单方法,c#,.net,file,C#,.net,File,在我的应用程序中,用户可以输入文件名。在处理之前,我想检查输入字符串是否是Windows Vista上的有效文件名 最简单的方法是什么 通过valid,我正在引用合法的和不存在的检查文件名.IndexOfAny(Path.GetInvalidFileNameChars())>=0和!File.Exists(Path.Combine(someFolder,filename))检查GetInvalidFileNameChars(): var isValid=!string.IsNullOrEmpty

在我的应用程序中,用户可以输入文件名。在处理之前,我想检查输入字符串是否是Windows Vista上的有效文件名

最简单的方法是什么


通过valid,我正在引用合法的和不存在的检查
文件名.IndexOfAny(Path.GetInvalidFileNameChars())>=0
!File.Exists(Path.Combine(someFolder,filename))
检查
GetInvalidFileNameChars()

var isValid=!string.IsNullOrEmpty(文件名)&&
fileName.IndexOfAny(Path.GetInvalidFileNameChars())<0&&
!File.Exists(Path.Combine(sourceFolder,fileName));

如果要创建文件,应使用文件对话框指定目录路径。文件名中有一小部分非法字符

判断文件名是否可接受的唯一真正可靠的方法是尝试它。权限 是一个沼泽。

我用这个:

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;
}
公共静态bool IsValidFileName(字符串名称){
if(string.IsNullOrWhiteSpace(name))返回false;
如果(name.Length>1&&name[1]==':'){
如果(name.Length<4 | | | name.ToLower()[0]<'a'| | name.ToLower()[0]>'z'| | | name[2]!='\\')返回false;
name=name.子字符串(3);
}
如果(name.StartsWith(“\\\”)name=name.Substring(1);
如果(name.EndsWith(“\\”)| | | |!name.Trim().Equals(name)| | name.Contains(“\\\”)||
name.IndexOfAny(Path.GetInvalidFileNameChars().Where(x=>x!='\\').ToArray())>=0)返回false;
返回true;
}

除了保留的名称、权限和长度限制之外,应该处理所有内容。它同时接受相对和绝对文件名。

这只是一个想法。应填写例外列表:

public static bool IsValidFilename(string filename)
{
    try
    {
        File.OpenRead(filename).Close();
    }
    catch (ArgumentException) { return false; }
    catch (Exception) { }
    return true;
}

当你说有效文件名时,你是指该文件存在的事实,还是你在问操作系统是否允许该名称?是否在(a)现有,(b)合法,或(c)合法和不存在中有效?我应该澄清这一点。它应该是(c)leagl和non-existing@roflcopter:您必须在创建文件时简单地处理错误。任何涉及存在性检查的文件系统操作在返回时都可能已过期,因为该文件系统是一个全局共享资源。@Roflcoptr:在检查有效性和/或存在性的那一刻之间创建的一个名称完全相同的文件,当你真正尝试创建它的时候,并不被认为是正常的程序流。您应该验证该文件是否不存在,但当您实际创建该文件时,该知识已经过时,应该仅将其视为有根据的猜测。它可能仍然为true,但不能保证。从该方法返回的数组不能保证包含在文件名和目录名中无效的完整字符集。此外,该属性已弃用。反例:
“http://www.microsoft.com/
通过了测试,但不是有效的文件名,同上:“更多反例:”“无效,新字符串('x',1024)也无效。@shellster您可以将文件重命名为“.txt”在windows资源管理器中,通知资源管理器将文件重命名为“.txt.”。只需一个提示(或“.txt…”也可以)。这应该是
<0
,而不是
=0
,因为
IndexOfAny()
将返回-1,如果没有找到反例:
”http://www.microsoft.com/
通过了测试,但不是有效的文件名,与
相同:
@Ben Voigt:您正确地认为
被错误地视为有效。我已经更正了答案,表示
<0
而不是
==0
。哦,我刚刚注意到您使用的是
GetInvalidFileNameChars
,而不是像SLaks那样的
GetInvalidPathChars
。只要它只是对文件名的测试,而不是对带有路径的文件名的测试,那就可以了。@Ben Voigt:因为OP要求验证文件名,而路径只是隐式地验证文件不存在,所以我使用了
GetInvalidFileNameChars
:-)文件对话框是一个红鲱鱼,但是+1表示“唯一真正可靠的方法…是尝试它”.同意。即使文件名不存在且不包含非法字符,也有许多原因导致无法创建文件,最明显的原因是缺少对目录的创建权限。有时需要保存到未知路径,但不希望用户选择确切路径。在这些情况下,文件对话框是不可行的。如果文件还不存在怎么办?@MikeCheel只有在引发参数异常时,代码才会返回false。只有当文件名无效时才会引发该异常。
public static bool IsValidFilename(string filename)
{
    try
    {
        File.OpenRead(filename).Close();
    }
    catch (ArgumentException) { return false; }
    catch (Exception) { }
    return true;
}