যে বিষয়টি কেউ অনুধাবন করতে পারে বলে মনে হয় তা হল যে কোনও System.Uri
নির্মাণকারীরই নির্দিষ্ট লক্ষকে সঠিকভাবে পরিচালনা করে নি।
new Uri(@"C:\%51.txt").AbsoluteUri;
এটি আপনাকে "file:///C:/Q.txt"
পরিবর্তে দেয় "file:///C:/%2551.txt"
।
অবহেলিত ডন্টস্ক্রপ আর্গুমেন্টের কোনও মানই কোনও পার্থক্য করে না এবং ইউরিকাইন্ড নির্দিষ্ট করে একই ফলাফল দেয়। ইউরিবিল্ডারের সাথে চেষ্টা করা কোনওভাবেই সহায়তা করে না:
new UriBuilder() { Scheme = Uri.UriSchemeFile, Host = "", Path = @"C:\%51.txt" }.Uri.AbsoluteUri
এটিও ফিরে আসে "file:///C:/Q.txt"
।
যতদূর আমি বলতে পারি ফ্রেমওয়ার্কটিতে আসলে এটি সঠিকভাবে করার কোনও উপায়ের অভাব রয়েছে।
আমরা ব্যাকস্ল্যাশগুলি ফরোয়ার্ড স্ল্যাশগুলির সাথে প্রতিস্থাপন করে এটির পথটি ফিড করতে পারি Uri.EscapeUriString
- অর্থাৎ
new Uri(Uri.EscapeUriString(filePath.Replace(Path.DirectorySeparatorChar, '/'))).AbsoluteUri
এটি প্রথমে কাজ করছে বলে মনে হয়, তবে আপনি যদি এই পথটি দেন C:\a b.txt
তবে আপনি file:///C:/a%2520b.txt
তার পরিবর্তে শেষ করবেন file:///C:/a%20b.txt
- কোনওভাবে এটি সিদ্ধান্ত নিয়েছে যে কিছু সিকোয়েন্সগুলি ডিকোড করা উচিত তবে অন্যকে নয়। এখন আমরা কেবল "file:///"
নিজের সাথে উপসর্গ করতে পারি, তবে এটি ইউএনসি পাথগুলি বিবেচনার মতো গ্রহণ করতে ব্যর্থ হয় \\remote\share\foo.txt
- যা উইন্ডোজে সাধারণত গ্রহণযোগ্য বলে মনে হয় তা হ'ল ফর্মের সিউডো-ইউআরএলগুলিতে পরিণত করা file://remote/share/foo.txt
, সুতরাং আমাদের এটিও বিবেচনায় নেওয়া উচিত।
EscapeUriString
এটিরও সমস্যা আছে যে এটি '#'
চরিত্রটি এড়ায় না । এটি এই মুহুর্তে মনে হবে যে স্ক্র্যাচ থেকে আমাদের নিজস্ব পদ্ধতি তৈরি করা ছাড়া আমাদের আর কোনও উপায় নেই। সুতরাং এই আমি পরামর্শ:
public static string FilePathToFileUrl(string filePath)
{
StringBuilder uri = new StringBuilder();
foreach (char v in filePath)
{
if ((v >= 'a' && v <= 'z') || (v >= 'A' && v <= 'Z') || (v >= '0' && v <= '9') ||
v == '+' || v == '/' || v == ':' || v == '.' || v == '-' || v == '_' || v == '~' ||
v > '\xFF')
{
uri.Append(v);
}
else if (v == Path.DirectorySeparatorChar || v == Path.AltDirectorySeparatorChar)
{
uri.Append('/');
}
else
{
uri.Append(String.Format("%{0:X2}", (int)v));
}
}
if (uri.Length >= 2 && uri[0] == '/' && uri[1] == '/') // UNC path
uri.Insert(0, "file:");
else
uri.Insert(0, "file:///");
return uri.ToString();
}
এটি ইচ্ছাকৃতভাবে + এবং: আনইনকোড ছাড়ায় যা মনে হয় এটি উইন্ডোজে সাধারণত কীভাবে হয়। এটি শুধুমাত্র লাতিন 1 কে এনকোড করে কারণ ইন্টারনেট এক্সপ্লোরার এনকোড করা থাকলে ফাইল ইউআরএলগুলিতে ইউনিকোড অক্ষর বুঝতে পারে না।
var path = new Uri("file:///C:/whatever.txt").LocalPath;
যার প্রয়োজন হয় তার জন্যও একটি ইউরি স্থানীয় ফাইলপথে পরিণত করে।