从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();