C# .exe的位置是否会影响 System.IO.Files.ReadAllLines() 函数

本文关键字:Files IO ReadAllLines 函数 System 影响 exe 位置 是否 | 更新日期: 2023-09-27 18:37:01

我创建了一个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但没有内容加载到数组中。否则,当它在程序文件(x86)中设置时,一切正常。为什么会这样?我该如何解决问题?

C# .exe的位置是否会影响 System.IO.Files.ReadAllLines() 函数

上面的

汉斯评论是正确的,但我相信除了目标/执行平台之外,还有更多。首先,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 建议的那样)并使用它而不是相对路径。我推荐后一种选择。

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

我应该使用 AppDomain.CurrentDomain.BaseDirectory 还是 System.Environment.CurrentDirectory?

为什么 AppDomain.CurrentDomain.BaseDirectory asp.net 应用程序中不包含"bin"?

AppDomain.BaseDirectory Property

File.ReadAllLines 方法(字符串)