C#/.NET Framework 使用 Uri 類型表示文件路徑時需要注意的問題


Uri

Uri Class (System) | Microsoft Docs

從文檔和 Uri 的屬性可以看出,Uri 主要是為 web 端的場景服務的,當然,本地文件也可以用,但需要注意一個重要的問題,本地文件,只能使用 LocalPath 這一個屬性,用於表示文件路徑。
其它屬性都有可能出錯,從而找不到文件。

本地文件只能使用 LocalPath 這一個屬性。
本地文件只能使用 LocalPath 這一個屬性。
本地文件只能使用 LocalPath 這一個屬性。

Demo

public static void Test()
{
    var folder1 = @"C:\Test\張 三\";
    var folder2 = @"C:\Test\zhang san\";
    System.IO.Directory.CreateDirectory(folder1);
    System.IO.Directory.CreateDirectory(folder2);
    var file1 = Path.Combine(folder1, "test.txt");
    var file2 = Path.Combine(folder2, "test.txt");
    File.WriteAllText(file1, "NULL");
    File.WriteAllText(file2, "NULL");

    Console.WriteLine("中文路徑");
    Test(file1);

    Console.WriteLine("\n英文路徑");
    Test(file2);

    var file_protocol_1 = $"file:///{file1}";
    var file_protocol_2 = $"file:///{file2}";

    Console.WriteLine("\n帶協議 中文路徑");
    Test(file_protocol_1);

    Console.WriteLine("\n帶協議 英文路徑");
    Test(file_protocol_2);
}

private static void Test(string filePath)
{
    Uri uri = new Uri(filePath);
    Console.WriteLine($"OriginalString {uri.OriginalString}\n{File.Exists(uri.OriginalString)}");
    Console.WriteLine($"AbsoluteUri {uri.AbsoluteUri}\n{File.Exists(uri.AbsoluteUri)}");
    Console.WriteLine($"AbsolutePath {uri.AbsolutePath}\n{File.Exists(uri.AbsolutePath)}");
    Console.WriteLine($"LocalPath {uri.LocalPath}\n{File.Exists(uri.LocalPath)}");
}

Demo 結論

其實與語言無關,只要中間出現非英文字符,就會出現 URL 編碼轉義。

在線URL編碼解碼工具-UrlEncode編碼-UrlDecode解碼在線工具

原始字符串沒有協議

屬性 File.Exist
OriginalString C:\Test\zhang san\test.txt true
AbsoluteUri file:///C:/Test/zhang%20san/test.txt false
AbsolutePath C:/Test/zhang%20san/test.txt false
LocalPath C:\Test\zhang san\test.txt true

原始字符串帶有協議

屬性 File.Exist
OriginalString file:///C:\Test\zhang san\test.txt false
AbsoluteUri file:///C:/Test/zhang%20san/test.txt false
AbsolutePath C:/Test/zhang%20san/test.txt false
LocalPath C:\Test\zhang san\test.txt true

教訓

本地文件只能使用 LocalPath 這一個屬性。
本地文件只能使用 LocalPath 這一個屬性。
本地文件只能使用 LocalPath 這一個屬性。

原文鏈接:
https://www.cnblogs.com/jasongrass/p/12284564.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM