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

时间:2016-03-01 23:17:41

标签: c# file

我已经创建了一个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)中设置时,一切都很好。为什么会这样?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

上面的Hans评论是正确的,但我相信除了目标/执行平台之外还有更多内容。首先,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)