2016-11-21 65 views
1

Inno Setup是否可以通过编程方式生成文件标志?我的安装程序源包含大量的文件,大小可以在一个可调整的目录结构中。目前,我通过一次添加整个文件夹来最小化脚本的复杂性。这很好,但是,整个层次结构中散布着大量文件,这些文件不能从压缩中受益(例如* .jpg),并且显着增加了安装程序的构建时间。理想情况下,我想这样做:以编程方式生成Inno Setup文件标志

Source: "{#MySrc}\*"; DestDir: "{#MyDst}"; Flags: {code:GetFlags}; 

哪里GetFlags会检查当前文件的扩展名,并为我不想压缩的文件类型返回“nocompression”。那可能吗?我似乎无法在文档或在线中找到任何可以表明它的内容。如果没有,有没有其他的简单方法来实现这一目标?

我能想到的这样做的唯一的另一种方法是为每一个类型的附加文件中的行,这样

Source: "{#MySrc}\*"; DestDir: "{#MyDst}"; Excludes: "*.jpg,*.dds"; Flags: "ignoreversion recursesubdirs"; 
Source: "{#MySrc}\*.jpg"; DestDir: "{#MyDst}"; Flags: "ignoreversion recursesubdirs nocompression"; 
Source: "{#MySrc}\*.dds"; DestDir: "{#MyDst}"; Flags: "ignoreversion recursesubdirs nocompression"; 

虽然这是可行的,我需要在这几个变化每次遇到我决定不压缩的文件类型时,都会放置这些文件。所以如果可能的话,我宁愿将逻辑放在一个地方。

回答

0

您的解决方案并不错。如果您向我们提供详细信息,我们可能会帮助您找到不需要“每次都在多处更换”的解决方案。


无论如何,它可以生成使用preprocessor[Files]部分。通过这种方式,您可以更改每种文件类型的Flags。但代码也很复杂。由于预处理器的限制,它不适用于真正的大型目录结构(我设法使它可以处理多达3500个文件)。

#pragma parseroption -p- 

#define FileFlags(FileName) \ 
    Local[0] = Lowercase(ExtractFileExt(FileName)), \ 
    (Local[0] == "jpg" || Local[0] == "dds" ? "nocompression" : "") 

#define FileEntry(Source, DestDir) \ 
    "Source: \"" + Source + "\"; DestDir: \"" + DestDir + "\"; " + \ 
    "Flags: " + FileFlags(Source) + "\n" 

#define ProcessFile(Source, DestDir, FindResult, FindHandle) \ 
    FindResult \ 
     ? \ 
      Local[0] = FindGetFileName(FindHandle), \ 
      Local[1] = Source + "\\" + Local[0], \ 
      (Local[0] != "." && Local[0] != ".." \ 
       ? (DirExists(Local[1]) \ 
         ? ProcessFolder(Local[1], DestDir + "\\" + Local[0]) \ 
         : FileEntry(Local[1], DestDir)) \ 
       : "") + \ 
      ProcessFile(Source, DestDir, FindNext(FindHandle), FindHandle) \ 
     : \ 
      "" 

#define ProcessFolder(Source, DestDir) \ 
    Local[0] = FindFirst(Source + "\\*", faAnyFile), \ 
    ProcessFile(Source, DestDir, Local[0], Local[0]) 

#pragma parseroption -p+ 

根据需要修改FileFlags宏。并使用ProcessFolder宏像:

[Files] 

#emit ProcessFolder(MySrc, MyDst) 

它将产生像一个代码:

Source: "C:\source\file.txt"; DestDir: "{app}"; Flags: 
Source: "C:\source\subfolder\file.jpg"; DestDir: "{app}\subfolder"; Flags: nocompression 
Source: "C:\source\subfolder\another.txt"; DestDir: "{app}\subfolder"; Flags: 

(与MySrc = C:\sourceMyDst = {app}

参见Inno Setup: How do I see the output (translation) of the Inno Setup Preprocessor?


灵感来自answer by @Zlatko KarakašUse Inno Setup PreProcessor to get the files and size of the source path and its subdirs

+0

非常有帮助。谢谢。 – user7134019