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;
Другие вопросы по тегам