2016-11-21 3 views
1

Inno Setup에서 프로그래밍 방식으로 파일 플래그를 생성 할 수 있습니까? 설치 프로그램 소스에 상당한 파일 구조가 있습니다. 현재는 한 번에 전체 폴더를 추가하여 스크립트의 복잡성을 최소화했습니다. 그러나 정상적으로 작동하지만 계층 구조 전체에 뿌려진 압축 파일 (예 : * .jpg)이 없기 때문에 설치 프로그램 빌드 시간이 크게 늘어납니다. 이상적으로, 내가 좋아하는 일을하고 싶습니다 : GetFlags 현재 파일의 확장자를 확인하고 내가 압축하지 않으려는 파일 형식 "nocompression"를 반환Inno Setup 파일 플래그를 프로그래밍 방식으로 생성하기

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

. 그게 가능하니? 나는 문서 또는 온라인에서 그 사실을 나타내는 어떤 것도 찾을 수없는 것 같습니다. 그렇지 않다면 이것을 달성하는 다른 직접적인 방법이 있습니까? 나는이 작업을 수행하는 생각할 수

유일한 다른 방법이 행할 수 있지만, 나는 몇 가지의 변화를해야 할 것이

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