कोई भी महसूस नहीं करता है कि System.Uri
निर्माणकर्ताओं में से कोई भी सही तरीके से कुछ संकेतों को नहीं दिखाता है।
new Uri(@"C:\%51.txt").AbsoluteUri;
इसके "file:///C:/Q.txt"
बदले आपको देता है "file:///C:/%2551.txt"
।
न तो हटाए गए NOTEscape तर्क के मूल्यों से कोई फर्क पड़ता है, और UriKind को निर्दिष्ट करने से समान परिणाम भी मिलता है। UriBuilder के साथ कोशिश करना भी मदद नहीं करता है:
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();
}
यह जानबूझकर छोड़ देता है + और: जैसा कि लगता है कि यह आमतौर पर विंडोज पर किया जाता है। इंटरनेट एक्सप्लोरर के यूनिकोड वर्णों को यूआरकोड के रूप में समझने की जरूरत नहीं है, अगर वे एनकोडेड हैं तो फाइल यूआरएल में यूनिकोड वर्णों को नहीं समझ सकते।
var path = new Uri("file:///C:/whatever.txt").LocalPath;
एक Uri को एक स्थानीय फ़ाइलपाथ में बदल देता है जो किसी को भी इसकी आवश्यकता होती है।