【问题标题】:C# Does the location of .exe impact on System.IO.Files.ReadAllLines() function?C# .exe 的位置是否影响 System.IO.Files.ReadAllLines() 函数?
【发布时间】:2016-03-01 23:17:40
【问题描述】:

我创建了一个 WFA 应用程序,并决定在我的 PC 上对其进行测试,因此我为它制作了一个安装程序。我的程序正在与同一文件夹中的 .txt 文件协作,因此在我的代码中,我通过 AppDomain.CurrentDomain.BaseDirectory 获取其执行路径并将其添加到“myTxt.txt”以获取 txt 路径。然后我通过 File.ReadAllLines() 读取它的内容到我的字符串数组。

string path = AppDomain.CurrentDomain.BaseDirectory;
string text = String.Concat(path,"mytxt.txt");
string[] content = File.ReadAllLines("mytxt.txt") // relative path

问题来了。每当我的程序设置在“程序文件”中时,我都可以打开 .txt 但没有内容加载到数组中。否则,当它在 Program files(x86) 中设置时,一切正常。为什么会这样?我该如何解决这个问题?

【问题讨论】:

  • 我建议在第二行使用System.IO.Path.Combine 而不是String.Concat。不过我不明白你的代码,你为什么要找到完整的路径,然后不在下一行使用它?当您使用text 作为参数值时会发生什么?
  • 完整路径是用来判断mtxt.txt文件是否存在还是应该创建一个
  • 如果您的 EXE 的平台目标是 AnyCPU 或 x64,您只能将程序存储在 c:\program 文件中。因此它将在 64 位操作系统上作为 64 位进程运行。默认值为 x86,任何文件打开请求都将被重定向到 c:\program files (x86)。通过右键单击您的 EXE 项目 > 属性 > 构建选项卡 > 平台目标设置来修复它。如果您看到它,请取消勾选“首选 32 位”。或者当然,将您的程序存储在 32 位目录中。
  • 谢谢汉斯,已经解决了:)

标签: c# file


【解决方案1】:

上面的汉斯评论是正确的,但我相信除了目标/执行平台之外还有更多。首先,AppDomain.BaseDirectory 不一定和exe文件夹一样。其次,当使用相对文件路径调用 ReadAllLines 方法时,会将其应用于 CurrentDirectory。您可以使用以下代码对此进行测试。

File.ReadAllLines("test.txt");
Directory.SetCurrentDirectory(@"c:\temp");
File.ReadAllLines("test.txt");

需要注意的另一点是 AppDomain.BaseDirectory 永远不会改变,而 CurrentDirectory 可以(并且可能会)改变很多次。

因此,如果您知道应用程序路径并且 mytxt.txt 文件位于应用程序路径的固定相对路径中,您可以通过更正作为参数传递给 ReadAllLines 函数的相对路径来修复您的代码。否则,您可以使用 Path.Combine 构建完整路径(如上面 ohiodoug 所建议的那样)并使用它而不是相对路径。我推荐后一种选择。

您可以在下面找到与您的问题相关的帖子和​​文档的一些链接:

Should I use AppDomain.CurrentDomain.BaseDirectory or System.Environment.CurrentDirectory?

Why AppDomain.CurrentDomain.BaseDirectory not contains “bin” in asp.net app?

AppDomain.BaseDirectory Property

File.ReadAllLines Method (String)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 2021-07-28
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多