Java Install4j:删除安装目录下特定目录中的文件

Java Install4j:删除安装目录下特定目录中的文件,java,install4j,Java,Install4j,我的问题是: 在sys.contentDir中,我们有libs目录。在这个目录中,我们有客户机和服务器目录。(实际上我们还有更多,但为了简洁起见,让我们保持简单。) 因此,当我们进行更新安装时,我们希望删除这些目录(client/server)中的所有JAR/文件,但不删除名为ext和plugin的子目录 为了让它更容易理解: 因此,外部矩形中的所有内容都将被卸载,但内部矩形中的所有内容都将保持原样 因此,通常您会使用卸载文件操作,但由于两个原因,这在这种特殊情况下不起作用。 1.您可以指定要卸

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

因此,当我们进行更新安装时,我们希望删除这些目录(
client
/
server
)中的所有JAR/文件,但不删除名为
ext
plugin
的子目录

为了让它更容易理解:

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

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

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

因此,我所做的是在卸载过程中执行一个附加步骤
删除文件和目录

它使用以下目录配置:
${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;
if(file.isDirectory()){
返回false;
}
文件目录=新文件(context.getInstallationDirectory(),“/lib”);
如果(!directory.exists()){
返回false;
}
List subDirs=new ArrayList();
文件[]拖欠=目录.listFiles();
对于(档案拖欠:拖欠){
if(拖欠的.isDirectory()){
添加子项(拖欠);
}
}
用于(文件子目录:子目录){
File[]filesInLib=sub.listFiles();
对于(文件:filesInLib){
if(theFile.equals(file))
{
Util.logInfo(null,“Delete”+file.getAbsolutePath());
返回true;
}
}
}
返回false;
它实际上工作得很好。但我想知道是否有更好的解决方案,比如只需配置这些东西而不使用任何代码。(我不想使用太多的代码片段来保持它的可维护性。)

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

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

现在我仍然有一个问题:我在
lib/client
目录中添加了一些额外的jar。它们不会随您的解决方案一起删除。