2016-05-10 34 views
1

我在這裏找到的一些問題/解決方案類似,但並不完全符合我的需求。Inno安裝程序:檢查文件是否存在C:驅動器中的任何地方

我正在嘗試爲我爲Windows創建的python應用程序創建一個安裝程序。安裝程序會調用另一個安裝程序(openscad_installer.exe),並且用戶可以選擇將其安裝在任何他們喜歡的位置(即我不知道目標位置,並且需要能夠找到它)或不安裝它。

我基本上需要檢查openscad.exe文件是否存在(即如果它被安裝)在計算機上的任何地方(在C:驅動器),如果它不存在,那麼我需要卸載我的軟件。

卸載過程似乎很簡單,但我不知道如何找出文件是否存在。謝謝您的幫助。

+0

請參見[依賴關係無法安裝時中止安裝](http://stackoverflow.com/q/37131619/850848)。 –

+0

謝謝你。如果你不介意幫助澄清...該鏈接的解決方案有代碼:如果不是FileExists(ExpandConstant('{app} \ {#MyAppExeName}'))...這是否意味着我必須知道在哪裏openscad是安裝?感謝您的鏈接。 –

+0

謝謝,我很難找到一個解決方案,「如果用戶已經安裝openscad」,所以也許我應該改變我的問題的標題。我想我需要在Pascal中執行相當於os.walk(python)的命令來查找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; 
相關問題