回答:
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から:「SchemeプロパティがUriSchemeFileと等しい場合、IsFileプロパティはtrueです。」だからあなたはそれに依存することはできません。
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
Uri.IsFile
、HTTP URL /スキームに試験を実施し、正常に使用したA 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
このようなエスケープされたURLの場合は戻り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");