Install4j:删除安装目录下某目录下的文件

Install4j: Delete files in certain directory below the installation directory

我的问题是: 在 sys.contentDir 中,我们有 libs 目录。在这个目录中,我们有 clientserver 目录。 (实际上我们有更多,但为了简洁起见,让我们保持简单。)

因此,当我们进行更新安装时,我们要删除这些目录 (client/server) 中的所有 jars/files, 但不删除子目录名称为 extplugin.

的目录

为了让它更容易理解:

因此外矩形中的所有内容都将被卸载,但内矩形中的所有内容将保持原样。

因此,通常您会使用 Uninstall files 操作,但出于两个原因,这在这种特殊情况下不起作用。 1. 您可以指定要卸载的目录,但只有在下面没有子目录(我们明确想要的)时才有效。 2. 您还可以为每个文件指定是否应删除。但是我们无法提供(所需 jar 的)文件列表,因为它可能会发生变化。

所以问题是:你如何最好地解决问题? (下面提供了解决方案!)

所以我所做的是在卸载过程中执行一个附加步骤 Delete files and directories

它是用这个目录配置的: ${installer:sys.contentDir}这是程序用install4j安装的平台无关的地方。

而 Java 代码是:

if (file.isDirectory()) {
    return false;
}

File directory = new File(context.getInstallationDirectory(), "/lib");
if (!directory.exists()) {
    return false;
}

List<File> subDirs = new ArrayList<>();
File[] delinquents = directory.listFiles();
for (File delinquent : delinquents) {
    if (delinquent.isDirectory()) {
        subDirs.add(delinquent);   
    }
}

for (File sub : subDirs) {

    File[] filesInLib = sub.listFiles();
    for(File theFile : filesInLib) {
        if (theFile.equals(file))
        {
            Util.logInfo(null, "Delete " + file.getAbsolutePath());
            return true;
        }
    }
}
return false;

它实际上工作得很好。但我想知道是否有更好的解决方案,比如你只需要配置这些东西而不使用任何代码。 (我不想使用很多代码片段来保持它的可维护性。)

可以使用"Delete files and directories"动作的"Directory filter script"属性,设置为

File contentDirectory = context.getContentDirectory();
return !directory.equals(new File(contentDirectory, "lib/client/ext")) &&
    !directory.equals(new File(contentDirectory, "lib/client/plugin"));