Install4j:删除安装目录

时间:2017-12-19 09:41:44

标签: java install4j

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

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

让它更容易理解:

the file tree

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用“删除文件和目录”操作的“目录过滤器脚本”属性并将其设置为

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

答案 1 :(得分:0)

所以我做的是在卸载过程中实现一个额外的步骤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;

它确实很完美。但我想知道是否有更好的解决方案,比如你只需配置这些东西而不使用任何代码。 (我不想使用大量代码片段来保持其可维护性。)