从C#中的URIstring获取文件名

我有这个从stringURI抓取文件名的方法。 我能做些什么来使它更强大?

private string GetFileName(string hrefLink) { string[] parts = hrefLink.Split('/'); string fileName = ""; if (parts.Length > 0) fileName = parts[parts.Length - 1]; else fileName = hrefLink; return fileName; } 

你可以创build一个System.Uri对象,并使用IsFile来validation它是一个文件,然后使用Uri.LocalPath来提取文件名。

这更安全一些,因为它为您提供了检查URI有效性的方法。


编辑回应评论:

为了得到完整的文件名,我会使用:

 Uri uri = new Uri(hreflink); if (uri.IsFile) { string filename = System.IO.Path.GetFileName(uri.LocalPath); } 

这会为你做所有的错误检查,并且是平台中立的。 所有的特殊情况都可以快速轻松地为您处理。

Uri.IsFile不能与http url一起使用。 它只适用于“file://”。 从MSDN :“当Scheme属性等于UriSchemeFile时,IsFile属性为true ”。 所以你不能依靠这个。

 Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.LocalPath); 

接受的答案是http url的问题。 此外, Uri.LocalPath会进行Windows特定的转换,正如有人指出在那里留下查询string。 更好的方法是使用Uri.AbsolutePath

为http url执行此操作的正确方法是:

 Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.AbsolutePath); 

大多数答案不完整或不处理path后面的东西(查询string/散列)。

 readonly static Uri SomeBaseUri = new Uri("http://canbeanything"); static string GetFileNameFromUrl(string url) { Uri uri; if (!Uri.TryCreate(url, UriKind.Absolute, out uri)) uri = new Uri(SomeBaseUri, url); return Path.GetFileName(uri.LocalPath); } 

检测结果:

 GetFileNameFromUrl(""); // "" GetFileNameFromUrl("test"); // "test.xml" GetFileNameFromUrl("test.xml"); // "test.xml" GetFileNameFromUrl("/test.xml"); // "test.xml" GetFileNameFromUrl("/test.xml?q=1"); // "test.xml" GetFileNameFromUrl("/test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3#aidjsf"); // "test.xml" GetFileNameFromUrl("http://www.a.com/a/b/c/d"); // "d" GetFileNameFromUrl("http://www.a.com/a/b/c/d/e/"); // "" 
 using System.IO; private String GetFileName(String hrefLink) { return Path.GetFileName(hrefLink.Replace("/", "\\")); } 

当然,这是假设你已经分析出文件名。

编辑#2:

 using System.IO; private String GetFileName(String hrefLink) { return Path.GetFileName(Uri.UnescapeDataString(hrefLink).Replace("/", "\\")); } 

这应该处理文件名中的空格等。

我认为这将做你所需要的:

 var uri = new Uri(hreflink); var filename = uri.Segments.Last();