包括UNC路径在内的验证Windows文件路径的正则表达式

5

我想验证一个包含完整路径的文件名。我尝试了以下几个正则表达式,但是它们都没有正确地工作。

^(?:[\w]\:|\\)(\\[a-z_\-\s0-9\.]+)+\.(txt|gif|pdf|doc|docx|xls|xlsx)$
and
^(([a-zA-Z]\:)|(\\))(\\{1}|((\\{1})[^\\]([^/:*?<>""|]*))+)$
etc...

我的需求如下: 假设文件名为"c:\Demo.txt",则应检查所有可能性,例如不应包含双斜杠(c:\\Demo\\demo.text)或多余的冒号(c::\Demo\demo.text)。还应接受UNC文件路径(\\staging\servers)和其他验证。请帮忙解决,我真的卡在这里了。

不是作业,实际上有一些重要的工作因为这个问题而被卡住了。 - Running Rabbit
1
如果您的文件已上传,那么您真正关心的是路径名还是仅仅是文件名部分? - Steve
文件正在上传,因为没有对其进行任何验证。我只想对文件名进行验证。你能帮我吗? - Running Rabbit
可能是重复的问题:在C#中检查文件名是否可能有效(而不是存在) - Patrick McDonald
这个问题包含了一个部分的答案。 - Allon Guralnek
2个回答

2

为什么你不使用File类?一定要使用它!

File f = null;
string sPathToTest = "C:\Test.txt";
try{
f = new File(sPathToTest );
}catch(Exception e){
   Console.WriteLine(string.Format("The file \"{0}\" is not a valid path, Error : {1}.", sPathToTest , e.Message);
}

MSDN: http://msdn.microsoft.com/en-gb/library/system.io.file%28v=vs.80%29.aspx

你可能只需要查看 File.Exists ( http://msdn.microsoft.com/en-gb/library/system.io.file.exists%28v=vs.80%29.aspx )

同时也可以查看 Path 类 ( http://msdn.microsoft.com/en-us/library/system.io.path.aspx )

GetAbsolutePath 可以是获得想要的路径的一种方式!( http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx )

string sPathToTest = "C:\Test.txt";
string sAbsolutePath = "";
try{
   sAbsolutePath = Path.GetAbsolutePath(sPathToTest);
   if(!string.IsNullOrEmpty(sAbsolutePath)){
     Console.WriteLine("Path valid");
   }else{
     Console.WriteLine("Bad path");
   }
}catch(Exception e){
   Console.WriteLine(string.Format("The file \"{0}\" is not a valid path, Error : {1}.", sPathToTest , e.Message);

}

我也尝试过这个方法,但它并没有帮助到我。所以我想尝试正则表达式。 - Running Rabbit
文件将被上传。文件名将在请求中提供。 - Running Rabbit
通常不建议使用异常处理来验证输入,因为它会产生显著的计算开销。 - Christopher King
我同意,但在这种情况下我没有看到其他的方法。也许可以通过执行File.Exist来判断是否为本地路径(而不是UNC路径)。 - ykatchou

0
如果你只对文件名部分感兴趣(而不是整个路径,因为你通过上传获取文件),那么你可以尝试类似这样的代码:
string uploadedName =  @"XX:\dem<<-***\demo.txt";

int pos = uploadedName.LastIndexOf("\\");
if(pos > -1)
    uploadedName = uploadedName.Substring(pos+1);

var c = Path.GetInvalidFileNameChars();
if(uploadedName.IndexOfAny(c) != -1)
     Console.WriteLine("Invalid name");
else
     Console.WriteLine("Acceptable name");

这将避免使用异常作为驱动代码逻辑的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接