Dosya adını C # 'daki URI dizesinden al


206

Bir dize URI dosya adı kapma için bu yöntemi var. Daha sağlam hale getirmek için ne yapabilirim?

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;
}

Yanıtlar:


388

Bir System.Uri nesnesi oluşturabilir ve bunun bir dosya olduğunu doğrulamak için IsFile , daha sonra dosya adını ayıklamak için Uri.LocalPath kullanabilirsiniz.

Bu, URI'nin geçerliliğini kontrol etmek için bir araç sağladığı için çok daha güvenlidir.


Yoruma yanıt olarak düzenleyin:

Sadece tam dosya adını almak için şunu kullanırdım:

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

Bu sizin için tüm hata denetimini yapar ve platformdan bağımsızdır. Tüm özel durumlar sizin için hızlı ve kolay bir şekilde halledilir.


Katılıyorum, Uri sınıfını sizin için zaten yaptığı gibi gerçekten kullanmalısınız. +1
Doctor Jones

2
Doğru, ama sadece dosya adına ihtiyacım var, tam dosya yoluna değil. Hala Uri.LocalPath üzerinde bu adımı atmak için bırakılmadım mı?
paulwhit

2
@paulwhit: Bu durumda, Uri.LocalPath sonuçlarında Path.GetFileName öğesini kullanmalısınız. Bu, tamamen güvenli ve kontrol edilmiş bir yöntemdir. Cevabımı buna dahil edecek şekilde düzenleyeceğim. Bkz: msdn.microsoft.com/tr-tr/library/…
Reed Copsey

49
isFile yalnızca şemaya benziyor. Yani: " www / myFile.jpg " yanlış döndürür, "file: //www/something.jpg" doğru döndürür, bu nedenle bu durumda işe yaramaz.
dethSwatch

6
Ayrıca bir sorgu dizesi sakının. http://www.test.com/file1.txt?a=bsonuçlanacakfile1.txt?a=b
Julian

76

Uri.IsFile http URL'leriyle çalışmaz. Yalnızca "file: //" için çalışır. Gönderen MSDN : "IsFile özelliktir gerçek Şema özelliği UriSchemeFile eşit olduğunda." Yani buna güvenemezsin.

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

Uri.LocalPath, Windows'a özgü dönüşümler yapar ve Windows olmayan bir ortamda düzgün çalışmaz. Bunu yapmanın taşınabilir bir yolu için aşağıdaki cevabıma bakın.
Kostub Deshmukh

Uri.IsFileBir http URL'sini / şemasını test etmek için kullanamasanız da, şu şekilde kullanarak dosya adını bir http URL'sinden başarıyla ayıklayabilirsinizSystem.IO.Path.GetFileName(url);
Alex Pandrea

50

Diğer yanıtların çoğu eksiktir veya yoldan sonra gelenlerle (sorgu dizesi / karma) ilgilenmez.

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);
}

Test sonuçları:

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/");              // ""

7
Neden GetFileNameFromUrl("test")sonuçlanır "test.xml" ? Yoksa bu sadece bir yazım hatası mı?
ckittel

27

Kabul edilen cevap http URL'leri için sorunludur. Dahası Uri.LocalPath, Windows'a özgü dönüşümler yapar ve birisinin işaret ettiği gibi orada sorgu dizeleri bırakır. Daha iyi bir yol kullanmaktırUri.AbsolutePath

Http URL'leri için bunu yapmanın doğru yolu:

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

7
Bunun gibi kaçan URL'ler için http://example.com/dir/hello%20world.txtgeri hello%20world.txtdönülürken, Uri.LocalPathyaklaşımın geri döneceğini unutmayınhello world.txt
Jeff Moser

22

Bunun ihtiyacınız olanı yapacağını düşünüyorum:

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

2
Bu gerçekten zarif bir çözüm gibi görünüyor, ancak bunun sadece mutlak URI'ler üzerinde çalıştığını ve kodlanmış / kaçan bir değer döndürdüğünü unutmayın ( Uri.UnescapeDataString()% 20 ve + değerini boşluklara değiştirmek için kullanın ).
Ronald

8
using System.IO;

private String GetFileName(String hrefLink)
{
    return Path.GetFileName(hrefLink.Replace("/", "\\"));
}

Bu, elbette, dosya adını ayrıştırdığınızı varsayar.

DÜZENLEME # 2:

using System.IO;

private String GetFileName(String hrefLink)
{
    return Path.GetFileName(Uri.UnescapeDataString(hrefLink).Replace("/", "\\"));
}

Bu, dosya adındaki boşlukları ve benzerlerini işlemelidir.


3
Kolonlar tüm platformlardaki yollarda kabul edilemez, bu nedenle, bu tür bir saldırı, örneğin * nix varyantı üzerinde çalışan Mono.NET'te başarısız olabilir. OP'nin ihtiyaç duyduğu şeyi yapmak için özel olarak tasarlandığından System.Uri'yi kullanmak daha iyidir.
richardtallent

1
Geçerli bir nokta! Mono'yu hep unuturum. Boşlukları ve benzerlerini düşündüm, ancak iki nokta üst üste değil.
Mike Hofer

2

bu benim örnek kullanabilirsiniz:

        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);
    }

Kullanımı:

var fileName = GetFileNameFromUrl("http://cdn.p30download.com/?b=p30dl-software&f=Mozilla.Firefox.v58.0.x86_p30download.com.zip");

0

Basit ve basit:

            Uri uri = new Uri(documentAttachment.DocumentAttachment.PreSignedUrl);
            fileName = Path.GetFileName(uri.LocalPath);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.