我是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,那么它将无法工作,所以我想我会尝试管理程序集。
任何人都可以给我一些见解,想法或链接吗?
答案 0 :(得分:0)
此方法适用于位于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");
参考:
答案 1 :(得分:0)
对于可执行文件(对网站和Web应用程序不确定),这将返回可执行文件所在的目录(它实际上是框架将探测要加载程序集的基本路径,99%的内容是相同的)。
System.AppDomain.CurrentDomain.BaseDirectory
答案 2 :(得分:0)
夫妻俩:
在已经说明的答案中,Assembly.GetExecutingAssembly()。Location还将为您提供当前“正在执行”的程序集的完整文件路径。 (或者,GetCurrentAssembly)
如果我正确地阅读了您的问题,那么您正试图找到自己的位置以及其他应用程序。我高度建议看看其他应用程序是否有一个指定确切位置的注册表项 - 它将使您的复制步骤更加稳定。