2016-05-10 1 views
1

Некоторые вопросы/решения, которые я нашел здесь, были похожи, но не совсем то, что мне нужно.Inno Setup: проверьте, существует ли файл в любом месте C: drive

Я пытаюсь создать установщик для приложения python, которое я создал для Windows. Установщик вызывает другой установщик (openscad_installer.exe), и у пользователя есть выбор установить его везде, где он захочет (т. Е. Я не знаю адресата и должен был бы его найти), или вообще не устанавливать его.

мне по существу нужно проверить, существует ли файл openscad.exe (то есть, если он установлен) в любом месте на компьютере (в C: диск) и если он не существует, то мне нужно удалить мое программное обеспечение.

Процесс удаления кажется достаточно простым, но я не знаю, как узнать, существует ли файл. Спасибо за помощь.

+0

См. [Отменить установку, если зависимость не установлена] (http://stackoverflow.com/q/37131619/850848). –

+0

Спасибо за это. Если вы не возражаете помочь пояснить ... Решение в этой ссылке имеет код: if not FileExists (ExpandConstant ('{app} \ {# MyAppExeName}')) ... Означает ли это, что я должен знать, где openscad is установлен? Спасибо за ссылку. –

+0

Спасибо, мне сложно найти решение для «если пользователь уже установил opencad», поэтому, возможно, мне следует изменить заголовок моего вопроса. Я думаю, что мне нужно сделать эквивалент os.walk (python) в Pascal, чтобы найти openscad.exe, но я не уверен, как это сделать. Пользователь может установить openscad в любой каталог, поэтому я не могу точно знать, где его найти. Приветствия. –

ответ

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; 
Смежные вопросы