2013-07-29 88 views
2

我有一些奇怪的问题(对我来说)。StreamReader路径自动更改

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

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

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

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

如果我运行启动器(使用的Process.Start)的firstapp应用一切顺利的罚款。 当我用控制台应用程序运行它,它不在firstapp所在的同一目录中时,我从代码的该部分(上面发布)中得到“目录未找到异常”。

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

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

您可以使用'Environment.CurrentDirectory'来查看您所在的目录,并对其进行更改。 –

+0

将'StreamReader'声明和用法包装在'using'语句中,并放弃'reader.Close();'。 –

回答

5

听起来像你需要在调用Process.Start之前设置你的进程的WorkingDirectory属性。

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

ProcessStartInfo startinfo = new ProcessStartInfo(); startinfo.FileName =“firstapp.exe”; startinfo.WorkingDirectory =“pathToAfolderWithFirstApp”; startinfo.Arguments =“arguments” Process.Start(startinfo); – Doctorslo

0

答案在问题中。你在说“当我用控制台应用程序运行它时,它不在同一个目录中”。如果它不在同一个目录下,如果它不存在,它将如何找到一个“Config”目录。请确保该目录存在

1

这是因为您的路径是相对的,当控制台应用程序启动winform时,当前工作目录不同。此外,您应该将流式阅读器封装在using声明中。就目前而言,除非您在代码的其他地方明确地调用Dispose(),否则您将继续使用应该释放的资源。

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

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)) { 
    //... 
} 

现在,它始终工作。