代码之家  ›  专栏  ›  技术社区  ›  devuxer

运行已安装的应用程序时,environment.currentdirectory产生意外结果

  •  14
  • devuxer  · 技术社区  · 16 年前

    背景:

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

    我在等你 环境.currentdirectory 成为。。。

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

    …但实际上…

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

    这是怎么回事?我如何解决这个问题?

    谢谢。

    编辑:

    好的,嗯。这个问题只有在我运行“开始”菜单快捷方式时才会出现。如果我直接运行myapp.exe,一切正常。

    编辑2:

    我想我现在已经搞清楚了。在我的安装程序(Visual Studio安装项目)中,“开始”菜单快捷方式具有一个名为 WorkingFolder ,它“指定将在其中安装快捷方式的目标应用程序的文件夹。”我意外地设置了 工作文件夹 “我的公司”。它应该是“应用程序文件夹”。现在我已经把它设置好了, 环境.currentdirectory 再次按预期工作。谢谢你的帮助。

    编辑3:

    但是,在阅读下面的警告时,我决定用下面的内容来替代 环境.currentdirectory :

    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    
    5 回复  |  直到 16 年前
        1
  •  34
  •   Alek Davis    16 年前

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

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

    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    
        2
  •  8
  •   Donut    16 年前

    使用 Application.StartupPath 而不是 Environment.CurrentDirectory .
    我也遇到过类似的问题, CurrentDirectory 不经意间被 OpenFileDialog 我都没意识到。
    在您的案例中,听起来您启动申请表的过程正在更改 当前目录 你不知道。

        3
  •  3
  •   Francis B.    16 年前

    因为您说过您的应用程序正在使用WPF,所以可以使用下面的代码而不是application.startuppath:

    String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
    
        4
  •  1
  •   Martin v. Löwis    16 年前

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

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

        5
  •  1
  •   den123    16 年前

    environment.current directory包含当前目录,而当前目录实际上是当前目录。这个值取决于许多因素。任何应用程序都可能更改该值。这个值与您的应用程序无关。

    如果要获取启动目录,请使用application.startuppath。