我有这种方法从字符串URI中获取文件名.我该怎么做才能让它更健壮?
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; }
Reed Copsey.. 372
您可以创建一个System.Uri对象,并使用IsFile验证它是一个文件,然后使用Uri.LocalPath来提取文件名.
这样更安全,因为它为您提供了检查URI有效性的方法.
编辑以回应评论:
要获得完整的文件名,我会使用:
Uri uri = new Uri(hreflink); if (uri.IsFile) { string filename = System.IO.Path.GetFileName(uri.LocalPath); }
这会为您完成所有错误检查,并且与平台无关.所有特殊情况都可以快速,轻松地为您处理.
您可以创建一个System.Uri对象,并使用IsFile验证它是一个文件,然后使用Uri.LocalPath来提取文件名.
这样更安全,因为它为您提供了检查URI有效性的方法.
编辑以回应评论:
要获得完整的文件名,我会使用:
Uri uri = new Uri(hreflink); if (uri.IsFile) { string filename = System.IO.Path.GetFileName(uri.LocalPath); }
这会为您完成所有错误检查,并且与平台无关.所有特殊情况都可以快速,轻松地为您处理.
Uri.IsFile不适用于http urls.它仅适用于"file://".来自MSDN:" 当Scheme属性等于UriSchemeFile时,IsFile属性为true." 所以你不能依赖它.
Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.LocalPath);
大多数答案要么不完整,要么不处理路径之后的内容(查询字符串/哈希).
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" 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/"); // ""
接受的答案对于http网址来说是有问题的.此外Uri.LocalPath
,Windows特定的转换,并有人指出在那里留下查询字符串.更好的方法是使用Uri.AbsolutePath
为http url执行此操作的正确方法是:
Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.AbsolutePath);
我认为这将满足您的需求:
var uri = new Uri(hreflink); var filename = uri.Segments.Last();
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("/", "\\")); }
这应该处理文件名中的空格等.