防止 Inno Setup 卸载使用 createallsubdirs 标志创建的空目录

Preventing Inno Setup from uninstalling empty directories created with createallsubdirs flag

我有一个文件夹(数据库文件夹)我想在卸载后保留(用于保存用户数据和将来重新安装),我已将顶级文件夹及其所有文件(和文件夹?)标记为永不卸载无论是否为空 Inno Setup 在卸载期间删除这些空的子文件夹(我想保留)。我是否必须声明我想保留的所有子文件夹,或者我是否缺少它们的标志?

[Dirs]
Name: "{app}\db\data"; Flags: uninsneveruninstall; Permissions: everyone-full

[Files]
Source: "D:\sesam\db\data\*"; DestDir: "{app}\db\data"; Flags: recursesubdirs createallsubdirs uninsneveruninstall; Check: CheckNotExists(ExpandConstant('{app}\db\data'))

卸载前和卸载后:

如您所见,它只保留 "non empty" 个文件夹。

在我看来像是一个错误,请考虑报告它。


无论如何,您可以使用 Inno Setup 预处理器为每个子文件夹生成 [Dirs] 个条目的列表:

[Dirs]
#define FindHandle
#define FindResult
#define SourceDataPath "D:\sesam\db\data"
#define TargetDataPath "{app}\db\data"

#sub ProcessFoundFile
  #define DirName FindGetFileName(FindHandle)
  #define DirPath SourceDataPath + "\" + DirName
  #if DirExists(DirPath) && (DirName != ".") && (DirName != "..")
    Name: "{#TargetDataPath + "\" + DirName}"; Flags: uninsneveruninstall
  #endif
#endsub

#for {FindHandle = FindResult = FindFirst(SourceDataPath + "\*", faDirectory); \
      FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
#expr FindClose(FindHandle)

以上仅适用于单层。如果需要递归,那就更复杂了。


将其放在脚本的末尾以查看预处理器生成的内容:

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")