C# StreamReader路径会自动更改

C# StreamReader路径会自动更改,c#,streamreader,C#,Streamreader,我(对我)有一些奇怪的问题 有一个应用程序是windows窗体应用程序“firstapp.exe”。 还有另一个应用程序也是windows窗体应用程序“launcher.exe”。 还有一个名为“server.exe”的控制台应用程序 firstapp和launcher都在同一个目录中。在该目录中还有一个“Config”文件夹,其中包含一些其他文件 我用于从firstapp中的config文件夹读取一个文件的代码: StreamReader reader = new StreamReader("

我(对我)有一些奇怪的问题

有一个应用程序是windows窗体应用程序“firstapp.exe”。 还有另一个应用程序也是windows窗体应用程序“launcher.exe”。 还有一个名为“server.exe”的控制台应用程序

firstapp和launcher都在同一个目录中。在该目录中还有一个“Config”文件夹,其中包含一些其他文件

我用于从firstapp中的config文件夹读取一个文件的代码:

StreamReader reader = new StreamReader("Config\\launcher.txt");
string readed_config = reader.ReadToEnd();
reader.Close();
如果我使用launcher运行firstapp应用程序(使用process.start),一切都会正常。 当我使用console应用程序运行它时,它与firstapp不在同一目录中,我从代码的这一部分(上面发布的)得到“目录未找到异常”

我怎样才能解决这个问题?
为什么控制台应用程序要将自己的路径添加到另一个应该独立运行的应用程序?

听起来您需要在调用
进程之前设置进程的属性。启动

string launcherPath = @"C:\SomePathToLauncher\Launcher.exe";
myProcess.StartInfo.FileName = launcherPath;
myProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(launcherPath);
myProcess.Start();

答案在问题中。您的意思是“当我使用控制台应用程序运行它时,它不在同一目录中”。如果它不在同一个目录中,如果它不存在,它将如何找到目录“Config”。确保目录存在于那里

这是因为当console应用程序启动winform时,您的路径是相对的,并且当前工作目录不同。此外,还应该使用
语句将流读取器包装在
中。目前,除非您在代码的其他地方显式调用
Dispose()
,否则您将保留应该释放的资源

要解决问题,请在使用
process.StartInfo.WorkingDirectory
启动进程时更改
WorkingDirectory
,或者更改代码中的路径,使其不是相对路径。或者,另一种选择是将路径传递给应用程序,或者从资源文件中读取路径,以便在执行时为其提供适当的路径

 StreamReader reader = new StreamReader("Config\\launcher.txt");
切勿在代码中使用硬编码的相对文件路径。这主要取决于Environment.CurrentDirectory,这太不可预测了。外部代码可以杀死你,因为你发现了。内部代码,使用OpenFileDialog,您的代码将崩溃。始终可以使用Assembly.GetEntryAssembly()获取完整路径。位置和路径类:

var exedir = Path.GetDirectory(Assembly.GetEntryAssembly().Location);
var path = Path.Combine(exedir, @"Config\launcher.txt");
using (var reader = new StreamReader(path)) {
    //...
}

现在它总是能工作。

我已经编辑了你的标题。请参见“”,其中共识是“不,他们不应该”。您可以使用
环境.CurrentDirectory
查看您所在的目录,并对其进行更改。使用
语句将
StreamReader
声明和用法包装在
中,并放弃
reader.Close()
.ProcessStartInfo startinfo=新的ProcessStartInfo();startinfo.FileName=“firstapp.exe”;startinfo.WorkingDirectory=“PathToFolderWithFirstApp”;startinfo.Arguments=“Arguments”进程.Start(startinfo);