답변:
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 URL에서 작동하지 않습니다. "file : //"에서만 작동합니다. 에서 MSDN :는 "ISFILE 속성입니다 진정한 예탁 자산이 UriSchemeFile 같을 때." 따라서 당신은 그것에 의존 할 수 없습니다.
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
Uri.IsFile
http URL / 구성표를 테스트하는 데 사용할 수는 없지만 다음을 사용 하여 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 URL에 문제가 있습니다. 또한 Uri.LocalPath
Windows 특정 변환이 수행되며 누군가 지적한 것처럼 쿼리 문자열이 남아 있습니다. 더 좋은 방법은 사용하는 것입니다Uri.AbsolutePath
http url에 대한 올바른 방법은 다음과 같습니다.
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");