2016-11-21 91 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