Inno Setup:检查文件是否存在于 C: 驱动器中的任何位置
Inno Setup: Check if file exists anywhere in C: drive
我在这里找到的一些 questions/solutions 很相似,但不是我需要的。
我正在尝试为我为 Windows 创建的 Python 应用程序创建安装程序。安装程序调用另一个安装程序 (openscad_installer.exe
),用户可以选择在他们喜欢的任何地方安装它(即我不知道目的地,需要能够找到它)或根本不安装它.
我基本上需要检查 openscad.exe
文件是否存在(即是否已安装)计算机上的任何位置(在 C:
驱动器中)如果它不存在,那么我需要卸载我的软件。
卸载过程看似简单,但不知道如何判断文件是否存在。感谢您的帮助。
在 C:
驱动器(可能还有任何其他驱动器,因为用户可能会选择在其他任何地方安装软件)中搜索文件是可行的,但可能需要很长时间。
我建议您改为检查 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD
注册表项是否存在:
const
OpenSCADRegKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD';
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
ResultCode: integer;
begin
Exec('OpenSCAD-xxx-Installer.exe', '', '', SW_SHOW, ewWaitUntilTerminated,
ResultCode);
if RegKeyExists(HKEY_CURRENT_USER_32, OpenSCADRegKey) or
RegKeyExists(HKEY_CURRENT_USER_64, OpenSCADRegKey) or
RegKeyExists(HKEY_LOCAL_MACHINE_32, OpenSCADRegKey) or
RegKeyExists(HKEY_LOCAL_MACHINE_64, OpenSCADRegKey) then
begin
Log('OpenSCAD is installed');
end
else
begin
Log('OpenSCAD is not installed');
{ Abort installation }
Result := 'OpenSCAD is not installed';
Exit;
end;
end;
如果需要知道安装位置,阅读并解析UninstallString
值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD]
"UninstallString"="C:\Program Files\OpenSCAD\Uninstall.exe"
如果您坚持要搜索 openscad.exe
,请使用:
function FindFile(RootPath: string; FileName: string): string;
var
FindRec: TFindRec;
FilePath: string;
begin
Log(Format('Searching %s for %s', [RootPath, FileName]));
if FindFirst(RootPath + '\*', FindRec) then
begin
try
repeat
if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
begin
FilePath := RootPath + '\' + FindRec.Name;
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then
begin
Result := FindFile(FilePath, FileName);
if Result <> '' then Exit;
end
else
if CompareText(FindRec.Name, FileName) = 0 then
begin
Log(Format('Found %s', [FilePath]));
Result := FilePath;
Exit;
end;
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end
else
begin
Log(Format('Failed to list %s', [RootPath]));
end;
end;
我在这里找到的一些 questions/solutions 很相似,但不是我需要的。
我正在尝试为我为 Windows 创建的 Python 应用程序创建安装程序。安装程序调用另一个安装程序 (openscad_installer.exe
),用户可以选择在他们喜欢的任何地方安装它(即我不知道目的地,需要能够找到它)或根本不安装它.
我基本上需要检查 openscad.exe
文件是否存在(即是否已安装)计算机上的任何位置(在 C:
驱动器中)如果它不存在,那么我需要卸载我的软件。
卸载过程看似简单,但不知道如何判断文件是否存在。感谢您的帮助。
在 C:
驱动器(可能还有任何其他驱动器,因为用户可能会选择在其他任何地方安装软件)中搜索文件是可行的,但可能需要很长时间。
我建议您改为检查 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD
注册表项是否存在:
const
OpenSCADRegKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD';
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
ResultCode: integer;
begin
Exec('OpenSCAD-xxx-Installer.exe', '', '', SW_SHOW, ewWaitUntilTerminated,
ResultCode);
if RegKeyExists(HKEY_CURRENT_USER_32, OpenSCADRegKey) or
RegKeyExists(HKEY_CURRENT_USER_64, OpenSCADRegKey) or
RegKeyExists(HKEY_LOCAL_MACHINE_32, OpenSCADRegKey) or
RegKeyExists(HKEY_LOCAL_MACHINE_64, OpenSCADRegKey) then
begin
Log('OpenSCAD is installed');
end
else
begin
Log('OpenSCAD is not installed');
{ Abort installation }
Result := 'OpenSCAD is not installed';
Exit;
end;
end;
如果需要知道安装位置,阅读并解析UninstallString
值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD]
"UninstallString"="C:\Program Files\OpenSCAD\Uninstall.exe"
如果您坚持要搜索 openscad.exe
,请使用:
function FindFile(RootPath: string; FileName: string): string;
var
FindRec: TFindRec;
FilePath: string;
begin
Log(Format('Searching %s for %s', [RootPath, FileName]));
if FindFirst(RootPath + '\*', FindRec) then
begin
try
repeat
if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
begin
FilePath := RootPath + '\' + FindRec.Name;
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then
begin
Result := FindFile(FilePath, FileName);
if Result <> '' then Exit;
end
else
if CompareText(FindRec.Name, FileName) = 0 then
begin
Log(Format('Found %s', [FilePath]));
Result := FilePath;
Exit;
end;
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end
else
begin
Log(Format('Failed to list %s', [RootPath]));
end;
end;