使用绝对路径进行文件访问时出现问题

时间:2019-01-17 15:40:39

标签: c# .net-core

我创建了一个.NetCore控制台应用程序,该应用程序试图使用其绝对路径检查文件是否存在,但是面临问题,即使文件存在,我也总是得到错误的响应。即使我将绝对路径作为参数传递给API,它也始终在当前工作目录前添加前缀,因此该路径将被评估为不存在。

我正在Windows 10桌面上运行此代码,并且该应用程序是使用.NetCore 2.1创建的。我尝试了各种不同的方法来评估文件的存在,例如FileInfo Class实例和File.Exists静态方法。到目前为止,他们已经失败了。我已经诊断出问题,但是找不到解决方法。

using System;
using System.IO;

namespace FileAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo fileInfo = new FileInfo(@"‪D:\ScriptData\test.zip");
            Console.WriteLine($"Full Name: {fileInfo.FullName}");
            Console.WriteLine($"FileInfo.Exists: {fileInfo.Exists}");
            Console.Write($"File.Exists with @: {File.Exists(@"‪D:\ScriptData\test.zip")}")
            Console.ReadLine();
        }
    }
}

代码输出为:

Full Name: D:\Work\Samples\FileAccess\FileAccess\bin\Debug\netcoreapp2.1\?D:\ScriptData\test.zip
False
False

即使传递绝对路径,它也会在当前工作目录的前面加上我传递的路径。我已经检查了对文件的访问权限,一切都很好,但在这两种情况下,我仍然都得到了错误的答复。

Screenshot of Error

Screenshot of Debug Info

2 个答案:

答案 0 :(得分:3)

判断屏幕快照和输出,文件路径的开头有一个不可见的字符。这将导致.NET无法识别它是绝对路径,并自动使其成为绝对路径。

如果使用此代码,则会注意到插入的?会在这里引起问题:

System.IO.FileInfo fi = new System.IO.FileInfo(@"?D:\some_file.ext");

哪个输出:C:\Users\...\ConsoleApp8\bin\Debug\netcoreapp2.2\?D:\some_file.ext

代替:

System.IO.FileInfo fi = new System.IO.FileInfo(@"D:\some_file.ext");

哪个输出:D:\some_file.ext

如果将代码放在十六进制编辑器中,您会发现D:之前确实有一个字符。

答案 1 :(得分:2)

感谢您剪切并粘贴了原始代码!我知道您这样做的原因是,当我剪切并粘贴代码时,可以看到您在打开引号之后和D:\之前有不可见的字符。

这两行看起来完全一样,但是却不一样!如果您不相信我,请剪切并粘贴它们!

您的代码:

        FileInfo fileInfo = new FileInfo(@"‪D:\ScriptData\test.zip");

固定代码:

        FileInfo fileInfo = new FileInfo(@"D:\ScriptData\test.zip");

这是二进制编辑器显示的内容。

enter image description here

E2 80 AA被秘密地卡在文件名开头的源代码文件中。恰好是LEFT-TO-RIGHT EMBEDDING字符的UTF-8表示形式。