Install4j:删除安装目录下某目录下的文件
Install4j: Delete files in certain directory below the installation directory
我的问题是:
在 sys.contentDir
中,我们有 libs
目录。在这个目录中,我们有 client
和 server
目录。 (实际上我们有更多,但为了简洁起见,让我们保持简单。)
因此,当我们进行更新安装时,我们要删除这些目录 (client
/server
) 中的所有 jars/files, 但不删除子目录名称为 ext
和 plugin
.
的目录
为了让它更容易理解:
因此外矩形中的所有内容都将被卸载,但内矩形中的所有内容将保持原样。
因此,通常您会使用 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"));
我的问题是:
在 sys.contentDir
中,我们有 libs
目录。在这个目录中,我们有 client
和 server
目录。 (实际上我们有更多,但为了简洁起见,让我们保持简单。)
因此,当我们进行更新安装时,我们要删除这些目录 (client
/server
) 中的所有 jars/files, 但不删除子目录名称为 ext
和 plugin
.
为了让它更容易理解:
因此外矩形中的所有内容都将被卸载,但内矩形中的所有内容将保持原样。
因此,通常您会使用 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"));