2012-10-01 114 views
0

我是C#的新手,我做了一个简单的Windows窗体应用程序,它基本上更新了游戏的个人文件。查找程序的安装路径

他们不得不手动移动和删除特定文件夹只是每次更改版本。我已经成功完成了这一点。

不过开始之前,我给它我真的应该改进。我知道我需要更改流程的名称并删除我的说明等。

我已经无意中发现了一个错误,而不是我采取的猜测,我认为最好是从一个更有经验的人了解如何做到这一点得到了意见。

我将使用创新安装,使安装我的应用程序,这样我可以肯定它会进入他们的程序文件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之前将其删除。

而且将使用的.exe嵌入其制作程序的组件资源Windows XP支持需要跑出管理员?我以前是通过UAC进行组装工作,但是如果他们关闭了UAC或者如果它是XP,那么这种工作方式总是能够正常工作,所以我想我会尝试使用管理组件。

任何人都可能给我一些见解,想法或链接?

回答

0

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

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"); 

参考:

+1

如何使用'Path.Combine'而不是'folder + filename'或'folder +“\\”+ filename'? –

+0

啊啊感谢您的想法,我编辑了Path.Combine代码 –

+0

现在,你不需要再检查\。 Path.Combine处理this.'string path = Path.Combine(文件夹,文件名); if(File.Exists(path))返回路径;'就够了。 –

0

可执行文件(不知道的网站& Web应用程序)这个返回目录下的可执行文件生命(它实际上是基本路径,其中框架将探测组件来加载,的的99%是一回事)。

System.AppDomain.CurrentDomain.BaseDirectory 
0

两件事:

  • 其中已经说明的答案,Assembly.GetExecutingAssembly()的位置也将让您的当前“执行”大会的完整文件路径。(或者,GetCurrentAssembly)

  • 如果我正确地阅读你的问题,你试图找到你自己的位置以及另一个应用程序的位置。我会高度建议看看其他应用程序是否有注册表项,指定确切的位置 - 它会使您的复制步骤更稳定。