Answers:
您可以只创建一个System.Uri对象,并使用IsFile验证它是一个文件,然后使用Uri.LocalPath提取文件名。
这更加安全,因为它还为您提供了一种检查URI有效性的方法。
编辑以回应评论:
要获取完整的文件名,我将使用:
Uri uri = new Uri(hreflink);
if (uri.IsFile) {
string filename = System.IO.Path.GetFileName(uri.LocalPath);
}
这将为您执行所有错误检查,并且与平台无关。所有特殊情况都会为您快速轻松地处理。
http://www.test.com/file1.txt?a=b
将导致file1.txt?a=b
Uri.IsFile不适用于http网址。它仅适用于“ file://”。来自MSDN:“ 当Scheme属性等于UriSchemeFile时,IsFile属性为true。” 因此,您不能依赖它。
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
Uri.IsFile
来测试http URL /方案,但是可以使用System.IO.Path.GetFileName(url);
大多数其他答案要么不完整,要么不处理路径后面的内容(查询字符串/哈希)。
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/"); // ""
GetFileNameFromUrl("test")
导致"test.xml"
?还是那只是一个错字?
对于http网址,可接受的答案是有问题的。此外Uri.LocalPath
,还会进行Windows特定的转换,并且有人指出将查询字符串留在那里。更好的方法是使用Uri.AbsolutePath
对http网址执行此操作的正确方法是:
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.AbsolutePath);
http://example.com/dir/hello%20world.txt
将返回hello%20world.txt
而该Uri.LocalPath
方法将返回hello world.txt
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("/", "\\"));
}
这应该处理文件名中的空格等。
这是我可以使用的示例:
public static string GetFileNameValidChar(string fileName)
{
foreach (var item in System.IO.Path.GetInvalidFileNameChars())
{
fileName = fileName.Replace(item.ToString(), "");
}
return fileName;
}
public static string GetFileNameFromUrl(string url)
{
string fileName = "";
if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri))
{
fileName = GetFileNameValidChar(Path.GetFileName(uri.AbsolutePath));
}
string ext = "";
if (!string.IsNullOrEmpty(fileName))
{
ext = Path.GetExtension(fileName);
if (string.IsNullOrEmpty(ext))
ext = ".html";
else
ext = "";
return GetFileNameValidChar(fileName + ext);
}
fileName = Path.GetFileName(url);
if (string.IsNullOrEmpty(fileName))
{
fileName = "noName";
}
ext = Path.GetExtension(fileName);
if (string.IsNullOrEmpty(ext))
ext = ".html";
else
ext = "";
fileName = fileName + ext;
if (!fileName.StartsWith("?"))
fileName = fileName.Split('?').FirstOrDefault();
fileName = fileName.Split('&').LastOrDefault().Split('=').LastOrDefault();
return GetFileNameValidChar(fileName);
}
用法:
var fileName = GetFileNameFromUrl("http://cdn.p30download.com/?b=p30dl-software&f=Mozilla.Firefox.v58.0.x86_p30download.com.zip");