2

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

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

firstapp 和启动器都在同一个目录中。在该目录中还有一个“配置”文件夹,其中包含一些其他文件。

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

StreamReader reader = new StreamReader("Config\\launcher.txt");
string readed_config = reader.ReadToEnd();
reader.Close();

如果我使用启动器(使用 process.start)运行 firstapp 应用程序,一切正常。当我使用控制台应用程序运行它时,它与 firstapp 不在同一目录中,我从那部分代码(上面发布)中得到“找不到目录异常”。

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

4

4 回答 4

5

听起来您需要在调用之前设置 Process 的WorkingDirectory属性Process.Start

string launcherPath = @"C:\SomePathToLauncher\Launcher.exe";
myProcess.StartInfo.FileName = launcherPath;
myProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(launcherPath);
myProcess.Start();
于 2013-07-29T17:37:28.527 回答
2
 StreamReader reader = new StreamReader("Config\\launcher.txt");

切勿在代码中使用硬编码的相对文件路径。它严重依赖于 Environment.CurrentDirectory ,这太不可预测了如您所见,外部代码可能会杀死您。内部代码也是如此,使用 OpenFileDialog 并且您的代码将崩溃。您始终可以使用 Assembly.GetEntryAssembly().Location 和 Path 类获得完整路径:

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

现在它总是有效。

于 2013-07-29T17:49:52.560 回答
1

这是因为您的路径是相对的,并且当控制台应用程序启动您的 winform 时,当前工作目录是不同的。此外,您应该将流阅读器包装在一个using语句中。就目前而言,除非您Dispose()在代码中的其他地方显式调用,否则您将持有应该释放的资源。

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

于 2013-07-29T17:38:18.230 回答
0

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

于 2013-07-29T17:37:37.340 回答