সি # তে ইউআরআই স্ট্রিং থেকে ফাইলের নাম পান


206

স্ট্রিং ইউআরআই থেকে ফাইলের নামটি ধরার জন্য আমার এই পদ্ধতিটি রয়েছে। এটিকে আরও শক্তিশালী করার জন্য আমি কী করতে পারি?

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

উত্তর:


388

আপনি কেবল একটি System.Uri অবজেক্ট তৈরি করতে পারেন এবং এটি কোনও ফাইল যাচাই করতে ইসফাইল ব্যবহার করুন, তারপরে ফাইলের নাম বের করতে Uri.LocalPath

এটি অনেক বেশি নিরাপদ, কারণ এটি আপনাকে ইউআরআইয়ের বৈধতাও যাচাই করার জন্য একটি উপায় সরবরাহ করে।


মন্তব্যের জবাবে সম্পাদনা করুন:

পুরো ফাইলের নাম পেতে, আমি ব্যবহার করব:

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

এটি আপনার জন্য ত্রুটি পরীক্ষা করার সমস্ত কাজ করে এবং প্ল্যাটফর্ম-নিরপেক্ষ। সমস্ত বিশেষ কেস আপনার জন্য দ্রুত এবং সহজেই পরিচালনা করা হবে।


আমি সম্মতি জানাই, আপনার ইতিমধ্যে উরি শ্রেণিটি ব্যবহার করা উচিত কারণ এটি ইতিমধ্যে আপনার জন্য এই জিনিসটি করে। +1
ডক্টর জোনস

2
ঠিক আছে, তবে আমার কেবল ফাইল নাম দরকার, পুরো ফাইল পাথ নয়। আমি কি এখনও ইউরি.লোকলপথে সেই পদক্ষেপটি ছেড়ে যেতে পারি না?
পলহিত

2
@ পলভুইট: সেক্ষেত্রে আপনার ইউরি.লোকলপথের ফলাফলের জন্য পাথ.গেটফিলনাম ব্যবহার করা উচিত। এটি পরিচালনা করার জন্য এটি সম্পূর্ণরূপে নিরাপদ, অত্যন্ত পরীক্ষিত উপায়। এটি অন্তর্ভুক্ত করার জন্য আমি আমার উত্তর সম্পাদনা করব। দেখুন: এমএসডিএন.মাইক্রোসফটকম
রিড কোপসি

49
isFile শুধুমাত্র এই স্কিমটি দেখায়। সুতরাং: " www / myFile.jpg " মিথ্যা ফিরিয়ে দেয়, "ফাইল: //www/something.jpg" সত্য প্রত্যাবর্তন করে, তাই এটি এই ক্ষেত্রে অকেজো।
dethSwatch

6
এছাড়াও কোয়েরিস্ট্রিং থেকে সাবধান থাকুন। http://www.test.com/file1.txt?a=bফলাফল হবেfile1.txt?a=b
জুলিয়ান

75

Uri.IsFile http url এর সাথে কাজ করে না। এটি কেবল "ফাইল: //" এর জন্য কাজ করে। এমএসডিএন থেকে : " যখন স্কিমের সম্পত্তিটি ইউরিস্কেমফিলের সমতুল্য হয় তখন ইসফাইল সম্পত্তিটি সত্য " " সুতরাং আপনি যে উপর নির্ভর করতে পারবেন না।

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

Uri.LocalPath উইন্ডোজ নির্দিষ্ট রূপান্তরগুলি করে এবং একটি উইন্ডোজবিহীন পরিবেশে সঠিকভাবে কাজ করে না। পোর্টেবল উপায় এটি করার জন্য আমার উত্তর নীচে দেখুন।
কোস্তুব দেশমুখ

আপনি যখন Uri.IsFileকোনও HTTP ইউআরএল / স্কিম পরীক্ষা করতে ব্যবহার করতে পারবেন না , আপনি কোনও URL টি ইউআরএল থেকে সাফল্যের সাথে ফাইলটির নামটি বের করতে পারবেনSystem.IO.Path.GetFileName(url);
অ্যালেক্স প্যান্ডরিয়া

50

বেশিরভাগ অন্যান্য উত্তর হয় অসম্পূর্ণ বা পথের পরে আসা স্টাফগুলি (ক্যোয়ারী স্ট্রিং / হ্যাশ) নিয়ে কাজ করবেন না।

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

7
কেন GetFileNameFromUrl("test")ফলাফল হবে "test.xml" বা এটি কেবল একটি টাইপো?
ckittel

27

গৃহীত উত্তরটি http url এর জন্য সমস্যাযুক্ত। তদুপরি Uri.LocalPathউইন্ডোজ নির্দিষ্ট রূপান্তরগুলি করে এবং কেউ এখানে কোয়েরি স্ট্রিংগুলিকে নির্দেশ করে। একটি ভাল উপায় ব্যবহার করা হয়Uri.AbsolutePath

HTTP url এর জন্য এটি করার সঠিক উপায় হ'ল:

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

7
নোট করুন যে পালিয়ে যাওয়া ইউআরএলগুলির জন্য এগুলি http://example.com/dir/hello%20world.txtফিরে আসবে hello%20world.txtযেখানে ফিরে Uri.LocalPathআসবেhello world.txt
জেফ মোসার

22

আমি মনে করি এটি আপনার যা প্রয়োজন তা করবে:

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

2
এটি প্রকৃতপক্ষে একটি মার্জিত সমাধানের মতো দেখায়, তবে কেবল মনে রাখবেন এটি কেবল নিখুঁত ইউআরআইতে কাজ করে এবং একটি এনকোডড / পালানো মান ( Uri.UnescapeDataString()% 20 এবং + স্পেসে পরিবর্তনের জন্য ব্যবহার করুন ) প্রদান করে।
রোনাল্ড

8
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("/", "\\"));
}

এটি ফাইলের নামের মতো স্পেস এবং এর মতো পরিচালনা করতে হবে।


3
কলোনগুলি সমস্ত প্ল্যাটফর্মে পাথগুলিতে গ্রহণযোগ্য নয়, সুতরাং এই ধরণের হ্যাক ব্যর্থ হতে পারে, বলুন, Mono.NET * নিক্স রূপে চলমান running সিস্টেম.উরি ব্যবহার করা আরও ভাল, যেহেতু এটি বিশেষত ওপি-র প্রয়োজনের জন্য তৈরি করা হয়েছে।
রিচার্ডাল্টলেন্ট

1
একটি বৈধ পয়েন্ট! আমি সবসময় মনো সম্পর্কে ভুলে যাই আমি স্পেস এবং পছন্দগুলি সম্পর্কে ভেবেছিলাম, তবে কোলোন নয়।
মাইক হফার

2

এটি আমার নমুনা আপনি ব্যবহার করতে পারেন:

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

0

সরল এবং সোজা এগিয়ে:

            Uri uri = new Uri(documentAttachment.DocumentAttachment.PreSignedUrl);
            fileName = Path.GetFileName(uri.LocalPath);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.