运行已安装的应用程序时,Environment.CurrentDirectory会产生意外结果

时间:2009-08-27 19:48:21

标签: c# .net wpf file-io windows-xp

背景

我为我的应用程序构建了一个安装程序,我的所有dll和内容文件都被正确地复制到C:\Program Files\MyCompany\MyApp目录。当我从Visual Studio运行我的应用程序时,一切都很好。但是,当我运行我的应用程序的已安装版本时,我得到DirectoryNotFoundException。问题似乎是Environment.CurrentDirectory

我期待Environment.CurrentDirectory成为......

"C:\\Program Files\\MyCompany\\MyApp"

......但实际上是......

"C:\\Documents and Settings\\DanThMan"

这里发生了什么?我该如何解决这个问题?

感谢。

修改

好的,嗯。如果我运行“开始”菜单快捷方式,则只会出现此问题如果我直接运行MyApp.exe,一切都很好。

编辑2:

我想我现在已经深究了这一点。在我的安装程序(Visual Studio SetupProject)中,“开始”菜单快捷方式具有名为WorkingFolder的属性,该属性“指定将安装快捷方式的目标应用程序的文件夹”。我不小心将WorkingFolder设置为“MyCompany”。它应该是“应用程序文件夹”。现在我已正确设置,Environment.CurrentDirectory再次按预期工作。谢谢你的帮助。

编辑3:

但是,阅读下面的警告,我决定使用以下内容替代Environment.CurrentDirectory

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

5 个答案:

答案 0 :(得分:34)

如果要获取运行可执行文件的目录的路径,则不应该依赖Environment.CurrentDirectory,因为它可以通过多种方式进行更改(shotrtcut设置等)。请尝试以下其中一个选项:

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

答案 1 :(得分:8)

使用Application.StartupPath代替Environment.CurrentDirectory。我遇到了类似的问题,CurrentDirectory在没有意识到的情况下被OpenFileDialog无意间改变了。
在你的情况下,听起来你正在启动申请表的过程正在改变你不知道的CurrentDirectory

答案 2 :(得分:3)

由于您说您的应用程序正在使用WPF,您可以使用下面的代码而不是Application.StartupPath:

String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);

答案 3 :(得分:1)

启动程序时,除非启动应用程序指定不同的工作目录,否则当前目录通常与启动应用程序的目录相同。它确实可以在磁盘上的任何地方。

在您的情况下,在两种情况下,启动应用程序都是shell(explorer.exe)。它在启动程序时指定工作目录,具体取决于启动的上下文。您已经看到两种不同的情况(在资源管理器中双击文件,然后从开始菜单运行);在这两种情况下,您还发现了Microsoft认为当前目录最明智的值:用户的主目录和资源管理器中显示的目录(分别)。

答案 4 :(得分:1)

Environment.CurrentDirectory包含当前目录,它实际上是当前目录。价值取决于许多因素。任何应用程序都可能更改该值。此值仅与您的应用程序无关。

如果要获取启动目录,请使用Application.StartupPath。