我创建了一个.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
即使传递绝对路径,它也会在当前工作目录的前面加上我传递的路径。我已经检查了对文件的访问权限,一切都很好,但在这两种情况下,我仍然都得到了错误的答复。
答案 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");
这是二进制编辑器显示的内容。
您E2 80 AA
被秘密地卡在文件名开头的源代码文件中。恰好是LEFT-TO-RIGHT EMBEDDING字符的UTF-8表示形式。