【问题标题】:Finding Install path of a program查找程序的安装路径
【发布时间】:2012-10-01 06:28:01
【问题描述】:

我是 C# 新手,我制作了一个简单的 Windows 窗体应用程序,它基本上更新了游戏的人员文件。

他们必须手动移动和删除某些文件夹才能每次更改版本。我已经成功地做到了。

但是,在我开始发布之前,我真的应该改进它。我知道我需要更改进程的名称并删除我的描述 ETC。

我偶然发现了一个错误,我认为最好从更有经验的人那里获得关于如何执行此操作的意见,而不是猜测。

我将使用 Inno Setup 为我的应用程序制作安装程序,这样我可以确保它将进入他们的 32 位和 64 位程序文件。所以我知道这将在程序文件中。

所以现在我想知道我是否以正确的方式做到了这一点?我使用这种格式来查找他们的程序文件:

string programFilesFolder = Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

但是,这是否适用于所有 Windows 系统(XP、Vista、Win7、Win8)?它是否完全准确?我本来打算用上面的,然后用这个:

        string PATCHSELECTOR = Path.Combine(programFiles, @"PATCH SELECTOR");
        if (Directory.Exists(PATCHSELECTOR))
        {
            string GamereliteFolder = Path.Combine(programFiles, @"GAMERELITE~1");
            if (Directory.Exists(GamereliteFolder))

然后我使用字符串方法移动文件。如果文件存在,则在我将文件从 PATCH SELECTOR 复制到 GAMERELITE 之前将其删除。

Windows XP 是否还支持使用嵌入了程序集资源的 .exe,这使得程序需要以管理员身份运行?我以前通过 UAC 使程序集工作,但是如果他们关闭了 UAC 或者如果它是 XP,这将不会总是有效,所以我想我会尝试使用管理程序集。

谁能给我一些见解、想法或链接?

【问题讨论】:

    标签: c#


    【解决方案1】:

    对于可执行文件(对于网站和 Web 应用程序不确定),这将返回可执行文件所在的目录(它实际上是框架将探测要加载的程序集的基本路径,其中 99% 是相同的)。

    System.AppDomain.CurrentDomain.BaseDirectory
    

    【讨论】:

      【解决方案2】:

      此方法适用于位于 Windows PATH 变量中定义的文件夹中的任何可执行文件:

      private string LocateEXE(String fileName)
      {
          string path = Environment.GetEnvironmentVariable("path");
          string[] folders = path.Split(';');
      
          foreach (var folder in folders)
          {
              if (File.Exists(Path.Combine(folder, fileName))) 
              {
                  return Path.Combine(folder, fileName);
              }
          }
      
          return String.Empty;
      }
      

      用法:

      string pathToEXE = LocateEXE("Example.exe");
      

      参考:

      【讨论】:

      • Path.Combine 代替folder + filenamefolder + "\\" + filename 怎么样?
      • 啊谢谢你的想法,我已经用 Path.Combine 编辑了代码
      • 现在,您不需要仔细检查 \。 Path.Combine 处理这个。string path = Path.Combine(folder, filename); if (File.Exists(path)) return path; 就够了。
      • 为什么要检查文件是否存在两次?
      【解决方案3】:

      几件事:

      • 在已经说明的答案中,Assembly.GetExecutingAssembly().Location 还将为您提供当前“正在执行”的程序集的完整文件路径。 (或者,GetCurrentAssembly)

      • 如果我正确阅读了您的问题,则说明您正在尝试查找您自己的位置以及其他应用程序的位置。我会强烈建议查看其他应用程序是否具有指定确切位置的注册表项 - 这将使您的复制步骤更加稳定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多