Inno Setup: Проверьте, существует ли файл где-нибудь на диске C:
Некоторые вопросы / решения, которые я нашел здесь, были похожи, но не совсем то, что мне было нужно.
Я пытаюсь создать установщик для приложения на Python, которое я создал для Windows. Установщик вызывает другой установщик (openscad_installer.exe), и у пользователя есть возможность установить его там, где он пожелает (то есть, я не знаю пункт назначения и должен быть в состоянии найти его) или вообще не устанавливать его.
По сути, мне нужно проверить, существует ли файл openscad.exe (т. Е. Установлен ли он) где-нибудь на компьютере (на диске C:), и, если он не существует, мне нужно удалить свое программное обеспечение.
Процесс удаления кажется достаточно простым, но я не знаю, как узнать, существует ли файл. Спасибо за помощь.
1 ответ
Поиск файла в 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;