getflags将检查当前文件的扩展,并返回我不想压缩的文件类型的“ nocorpression”。 有可能吗? 我似乎找不到文档或在线表明它的任何东西。 如果没有,还有其他直接的方法可以实现这一目标吗?
我能想到的唯一其他方式是为每种类型创建一个附加的文件行,例如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";
尽管这是可行的,但每次我遇到一个我决定不压缩的文件类型时,我都需要在多个地方进行此更改。 因此,如果可能的话,我宁愿将逻辑放在一个地方。
您的解决方案还不错。 如果您给我们的细节,我们可能会帮助您找到不需要“每次在几个地方更改”的解决方案。
,可以使用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:\source
=MyDst
=
{app}
)
请参阅Inno设置预处理器的输出(翻译)?
由@zlatkokarakaš
iNno设置预处理器启用,以获取源路径的文件和大小。