【问题标题】:Issue in file access with absolute paths使用绝对路径访问文件的问题
【发布时间】:2019-01-17 15:40:39
【问题描述】:

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

我在 Windows 10 桌面上运行此代码,并且该应用程序是使用 .NetCore 2.1 创建的。我尝试了各种不同的方法来评估文件的存在,例如 FileInfo 类实例和 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

【问题讨论】:

  • @Sk83r1l4m4 我尝试了您的建议,但仍然无法正常工作。但即使它有效也无助于我的情况,因为我必须将路径作为命令行参数传递。我分享的是一个示例代码。我已经检查了许可,这不是问题。
  • 赞成是因为您做了正确的事情来剪切和粘贴原始源代码,这揭示了字符串中不可见的 LEFT-TO-RIGHT EMBEDDING 字符的问题。荣誉。
  • WTF。我遇到过同样的问题。我再次复制了路径名,它解决了它。

标签: c# .net-core


【解决方案1】:

判断您的屏幕截图和输出,文件路径的开头有一个不可见的字符。这将导致 .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:之前确实有一个字符。

【讨论】:

  • 我的错,已经尝试修复了一个多小时。我注意到问号字符,感觉运行时以某种方式添加它。感谢您的快速解决,感觉很糟糕,这是一个非常小的问题,我不应该问这个。傻我:(
  • 没问题。尝试发布您引用的路径here,您将看到该角色。
【解决方案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 表示。

【讨论】:

  • 这是对问题的正确诊断,很抱歉只能接受一个答案。感谢您帮助我。
猜你喜欢
  • 2021-02-06
  • 2021-04-02
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多