我有一些奇怪的问题(对我而言)。
有一个应用程序是Windows窗体应用程序“firstapp.exe”。 还有另一个应用程序,也是Windows窗体应用程序“launcher.exe”。 并且有一个名为“server.exe”的控制台应用程序。
firstapp和启动器都在同一目录中。在该目录中还有一个“Config”文件夹,其中包含一些其他文件。
我用来从firstapp中的config文件夹中读取一个文件的代码:
StreamReader reader = new StreamReader("Config\\launcher.txt");
string readed_config = reader.ReadToEnd();
reader.Close();
如果我使用启动器(使用process.start)运行firstapp应用程序,一切顺利。 当我使用控制台应用程序运行它时,它与firstapp不在同一目录中,我从该部分代码(上面发布的)中获取“找不到目录的例外”。
我该如何解决这个问题? 为什么控制台应用程序将自己的路径添加到应该独立运行的另一个应用程序?
答案 0 :(得分:5)
在调用Process.Start
之前,您需要设置流程的WorkingDirectory属性。
string launcherPath = @"C:\SomePathToLauncher\Launcher.exe";
myProcess.StartInfo.FileName = launcherPath;
myProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(launcherPath);
myProcess.Start();
答案 1 :(得分:2)
StreamReader reader = new StreamReader("Config\\launcher.txt");
从不在代码中使用硬编码的相对文件路径。它关键取决于Environment.CurrentDirectory,而且方式太不可预测了。外部代码可以在您发现时杀死您。内部代码也使用OpenFileDialog,您的代码将崩溃。您总是可以使用Assembly.GetEntryAssembly()获取完整路径。位置和Path类:
var exedir = Path.GetDirectory(Assembly.GetEntryAssembly().Location);
var path = Path.Combine(exedir, @"Config\launcher.txt");
using (var reader = new StreamReader(path)) {
//...
}
现在它始终有效。
答案 2 :(得分:1)
这是因为您的路径是相对的,当控制台应用程序启动您的winform时,当前工作目录是不同的。此外,您应该将流阅读器包装在using
语句中。按照目前的情况,除非您在代码中的其他位置明确地调用Dispose()
,否则您将保留应该释放的资源。
要解决您的问题,请在使用WorkingDirectory
启动流程时更改Process.StartInfo.WorkingDirectory
,或更改代码中的路径,使其不相关。或者另一种选择是将路径传递给应用程序或从资源文件中读取它,以便在执行时为其提供适当的路径。
答案 3 :(得分:0)
答案就在于问题。你说的是“当我使用控制台应用程序运行它时,它不在同一目录中”。如果它不在同一目录中,它将如何找到目录“Config”,如果它不存在那里。确保目录存在