2016-12-05 82 views
2

在這種情況下,我需要安裝一個文件到特定的目錄,但是在不同的計算機上它可能在不同的文件夾中,所以我需要檢查哪一個是正確的。Inno Setup選擇一個目錄來安裝預定義文件集

例如,我有一個文件,它需要在A文件夾或文件夾BC的安裝文件夾,取決於計算機具有ABC。所以,我首先要檢查他們,如果計算機有B,然後安裝在B文件夾中的文件等

我知道我可以使用文件的DestDir後檢查,如果該目錄不存在,那麼它贏得」 t安裝任何東西,但我需要的是將該文件安裝到其他目​​錄。

在此先感謝。

+0

因此,您不希望允許用戶在「選擇目標位置」上選擇目標文件夾?相反,您想要自動選擇位置,具體取決於目標機器上已存在的位置,對嗎? –

+0

沒有辦法以某種方式選擇正確的位置(如讀取某個註冊表項),而不是嘗試一組硬編碼的目錄? –

回答

1

InitializeSetup event function中,檢查是否存在預定義的目錄集,並記住找到的目錄集。然後使用DefaultDirName directive中的scripted constant將默認安裝路徑設置爲找到的安裝路徑。

您可能還想設置DisableDirPage=yesUsePreviousAppDir=no

[Setup] 
DefaultDirName={code:GetDirName} 
DisableDirPage=yes 
UsePreviousAppDir=no 

[Files] 
Source: "MyProg.exe"; DestDir: "{app}" 
Source: "MyProg.chm"; DestDir: "{app}" 

[Code] 

var 
    DirName: string; 

function TryPath(Path: string): Boolean; 
begin 
    Result := DirExists(Path); 
    if Result then 
    begin 
    Log(Format('Path %s exists', [Path])) 
    DirName := Path; 
    end 
    else 
    begin 
    Log(Format('Path %s does not', [Path])) 
    end; 
end; 

function GetDirName(Param: string): string; 
begin 
    Result := DirName; 
end; 

function InitializeSetup(): Boolean; 
begin 
    Result := 
    TryPath('C:\path1') or 
    TryPath('C:\path2') or 
    TryPath('C:\path3'); 

    if Result then 
    begin 
    Log(Format('Destination %s selected', [DirName])) 
    end 
    else 
    begin 
    MsgBox('No destination found, aborting installation', mbError, MB_OK); 
    end; 
end; 

而不是使用DefaultDirName={code:GetDirName}的,你也可以用在[Files]部分的相應條目DestDir: "{code:GetDirName}",如果合適的話。

+0

謝謝!它有很大幫助! –

+0

我可以問C:\ path1和C:\ path2是否存在,我希望文件都安裝到這些文件夾,不僅在一個路徑中,我該如何解決這個問題?謝謝 –

+0

@SabrinaLiu在「文件」部分需要兩個單獨的條目。每個文件夾一個。 –