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:Testzhang 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("
英文路径");
    Test(file2);

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

    Console.WriteLine("
带协议 中文路径");
    Test(file_protocol_1);

    Console.WriteLine("
带协议 英文路径");
    Test(file_protocol_2);
}

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

Demo 结论

其实与语言无关,只要中间出现非英文字符,就会出现 URL 编码转义。

在线URL编码解码工具-UrlEncode编码-UrlDecode解码在线工具

原始字符串没有协议

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

原始字符串带有协议

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

教训

本地文件只能使用 LocalPath 这一个属性。
本地文件只能使用 LocalPath 这一个属性。
本地文件只能使用 LocalPath 这一个属性。

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

原文地址:https://www.cnblogs.com/jasongrass/p/12284564.html