pau*_*hit 192 c# string filenames uri
我有这种方法从字符串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;
}
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 372
您可以创建一个System.Uri对象,并使用IsFile验证它是一个文件,然后使用Uri.LocalPath来提取文件名.
这样更安全,因为它为您提供了检查URI有效性的方法.
编辑以回应评论:
要获得完整的文件名,我会使用:
Uri uri = new Uri(hreflink);
if (uri.IsFile) {
string filename = System.IO.Path.GetFileName(uri.LocalPath);
}
Run Code Online (Sandbox Code Playgroud)
这会为您完成所有错误检查,并且与平台无关.所有特殊情况都可以快速,轻松地为您处理.
小智 70
Uri.IsFile不适用于http urls.它仅适用于"file://".来自MSDN:" 当Scheme属性等于UriSchemeFile时,IsFile属性为true." 所以你不能依赖它.
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
Run Code Online (Sandbox Code Playgroud)
Ron*_*rby 38
大多数答案要么不完整,要么不处理路径之后的内容(查询字符串/哈希).
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);
}
Run Code Online (Sandbox Code Playgroud)
检测结果:
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/"); // ""
Run Code Online (Sandbox Code Playgroud)
Kos*_*ukh 24
接受的答案对于http网址来说是有问题的.此外Uri.LocalPath,Windows特定的转换,并有人指出在那里留下查询字符串.更好的方法是使用Uri.AbsolutePath
为http url执行此操作的正确方法是:
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.AbsolutePath);
Run Code Online (Sandbox Code Playgroud)
Zeu*_*s82 19
我认为这将满足您的需求:
var uri = new Uri(hreflink);
var filename = uri.Segments.Last();
Run Code Online (Sandbox Code Playgroud)
using System.IO;
private String GetFileName(String hrefLink)
{
return Path.GetFileName(hrefLink.Replace("/", "\\"));
}
Run Code Online (Sandbox Code Playgroud)
当然,这假定你已经解析出了文件名.
编辑#2:
using System.IO;
private String GetFileName(String hrefLink)
{
return Path.GetFileName(Uri.UnescapeDataString(hrefLink).Replace("/", "\\"));
}
Run Code Online (Sandbox Code Playgroud)
这应该处理文件名中的空格等.
public static string GetFileNameFromUrl (string url)
{
var decoded = HttpUtility.UrlDecode(url);
if (decoded.IndexOf("?") is {} queryIndex && queryIndex != -1)
{
decoded = decoded.Substring(0, queryIndex);
}
return Path.GetFileName(decoded);
}
Run Code Online (Sandbox Code Playgroud)