2016-12-05 39 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在“文件”部分需要两个单独的条目。每个文件夹一个。 –