当前位置:  开发笔记 > 编程语言 > 正文

从C#中的URI字符串获取文件名

如何解决《从C#中的URI字符串获取文件名》经验,为你挑选了6个好方法。

我有这种方法从字符串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);
}

这会为您完成所有错误检查,并且与平台无关.所有特殊情况都可以快速,轻松地为您处理.



1> Reed Copsey..:

您可以创建一个System.Uri对象,并使用IsFile验证它是一个文件,然后使用Uri.LocalPath来提取文件名.

这样更安全,因为它为您提供了检查URI有效性的方法.


编辑以回应评论:

要获得完整的文件名,我会使用:

Uri uri = new Uri(hreflink);
if (uri.IsFile) {
    string filename = System.IO.Path.GetFileName(uri.LocalPath);
}

这会为您完成所有错误检查,并且与平台无关.所有特殊情况都可以快速,轻松地为您处理.


isFile似乎只看这个计划.所以:"http://www/myFile.jpg"返回false,"file://www/something.jpg"返回true,所以在这种情况下它没用.
还要注意查询字符串.`http://www.test.com/file1.txt?a = b`将导致`file1.txt?a = b`
是的,但我只需要文件名,而不是完整的文件路径.我是不是还要继续在Uri.LocalPath上做那一步?
@paulwhit:在这种情况下,您应该在Uri.LocalPath的结果上使用Path.GetFileName.这是一种完全安全,高度检查的处理方式.我将编辑我的答案以包含此内容.请参阅:http://msdn.microsoft.com/en-us/library/system.io.path.getfilename.aspx

2> 小智..:

Uri.IsFile不适用于http urls.它仅适用于"file://".来自MSDN:" 当Scheme属性等于UriSchemeFile时,IsFile属性为true." 所以你不能依赖它.

Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.LocalPath);



3> Ronnie Overb..:

大多数答案要么不完整,要么不处理路径之后的内容(查询字符串/哈希).

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"`或者这只是一个错字?

4> Kostub Deshm..:

接受的答案对于http网址来说是有问题的.此外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`

5> Zeus82..:

我认为这将满足您的需求:

var uri = new Uri(hreflink);
var filename = uri.Segments.Last();



6> Mike Hofer..:
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("/", "\\"));
}

这应该处理文件名中的空格等.


冒号在所有平台上的路径中是不可接受的,因此这种黑客可能会失败,例如,在*nix变体上运行的Mono.NET.最好使用System.Uri,因为它专门设计用于执行OP所需的操作.
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有