检查路径输入是URL还是本地文件

我在xmldataprovider工作,我们有配置值“source”这个值可能是本地文件或url像

c:\ data \ test.xml –absolute data \ test.xml –relative

或url http:\ mysite \ test.xml

我如何在代码中确定所有这些情况我正在工作c#

private static bool IsLocalPath(string p) { return new Uri(p).IsFile; } 

…或者,如果您想包含对某些无效URI的支持……

 private static bool IsLocalPath(string p) { if (p.StartsWith("http:\\")) { return false; } return new Uri(p).IsFile; } 

示例用法

 static void Main(string[] args) { CheckIfIsLocalPath("C:\\foo.txt"); CheckIfIsLocalPath("C:\\"); CheckIfIsLocalPath("http://www.txt.com"); } private static void CheckIfIsLocalPath(string p) { var result = IsLocalPath(p); ; Console.WriteLine("{0} {1} {2}", result, p, new Uri(p).AbsolutePath); } 

仅使用new Uri(yourPath)将无法在所有情况下使用。

比较各种场景(通过LinqPad)。

  var tests = new[] { Path.GetTempFileName(), Path.GetDirectoryName(Path.GetTempFileName()), "http://in.ter.net", "http://in.ter.net/", "http://in.ter.net/subfolder/", "http://in.ter.net/subfolder/filenoext", "http://in.ter.net/subfolder/file.ext", "http://in.ter.net/subfolder/file.ext?somequerystring=yes", Path.GetFileName(Path.GetTempFileName()), Path.Combine("subfolder", Path.GetFileName(Path.GetTempFileName())), }; tests.Select(test => { Uri u; try { u = new Uri(test); } catch(Exception ex) { return new { test, IsAbsoluteUri = false, // just assume IsFile = true, }; } return new { test, u.IsAbsoluteUri, u.IsFile, }; }).Dump(); 

结果

Linqpad路径检查结果

只需为所有远程文件设置规则,它应该(并且必须)在URI中包含协议:

 http:// ftp:// 

对于本地文件,它可以

 file:// 

对于绝对路径而没有相对的协议。

然后简单的正则表达式可以帮助提取正确的信息。

如果路径格式错误(不存在的路径,空字符串,空字符串)Uri(p).IsFile会抛出exception。 在我看来,最好使用两种方法来辨别什么是:

 private bool PathIsLocalFile(string path) { return File.Exists(path); } private bool PathIsUrl(string path) { if (File.Exists(path)) return false; try { Uri uri = new Uri(path); return true; } catch (Exception) { return false; } } 

//

 Microsoft docs: public static bool Exists(string path); 

返回:如果调用者具有所需权限并且path包含现有文件的名称,则返回true; 否则,是的。 如果path为null,无效路径或零长度字符串,则此方法也返回false。 如果调用者没有足够的权限来读取指定的文件,则不会抛出exception,并且无论路径是否存在,该方法都返回false。 //

 Microsoft docs: public Uri(string uriString); 

例外:

 T:System.ArgumentNullException: 

uriString为null。

 T:System.UriFormatException: 

uriString为空.-或 – uriString中指定的方案未正确形成。 请参阅System.Uri.CheckSchemeName(System.String).-或 – uriString包含太多斜杠.-或 – uriString中指定的密码无效.-或 – uriString中指定的主机名无效.-或 – uriString中指定的文件名无效。 – 或者 – uriString中指定的用户名无效.-或 – uriString中指定的主机或授权名称不能通过反斜杠终止.-或 – uriString中指定的端口号无效或无法解析.-或 – uriString的长度超过65519个字符.-或 – uriString中指定的方案的长度超过1023个字符.-或 – uriString中的字符序列无效.-或 – uriString中指定的MS-DOS路径必须以c开头:\。