我有一个包含几个文件夹的zip,但重要的是dir,里面是另一个名为folder和folder的文件夹,其中包含很多我需要更新的文件。
我现在有一个名为dir的zip之外的dir,在那个文件夹中有我需要更新的文件,因此路径是相同的。如何将这些文件更新为zip?
棘手的部分是,dir是zip的根目录,它包含很多文件夹而不仅仅是文件夹,但我只需要更新文件夹中的文件我不能弄乱文件夹外的任何文件但还是在dir。
可以这样做吗?我知道这可以使用-u修饰符在bash中完成,但如果可能的话,我宁愿用java做这个。
感谢您对此问题的任何帮助
更清楚
内部邮编 /目录/文件夹/ filestoupdate
拉链外 /目录/文件夹/ filestomoveintozip
答案 0 :(得分:8)
好吧,这里是最后一个方法,它与我粘贴的方法相同,之前我实际上从链接@Qwe发布之前的stackoverflow主题获得但是我添加了路径变量,以便它可以将文件添加到zip中的文件夹< / p>
好吧现在如何在上面的示例中使用它我想将文件添加到另一个文件夹中的文件夹中我会在这样的问题中使用我的设置
private void addFilesToZip(File source, File[] files, String path){
try{
File tmpZip = File.createTempFile(source.getName(), null);
tmpZip.delete();
if(!source.renameTo(tmpZip)){
throw new Exception("Could not make temp file (" + source.getName() + ")");
}
byte[] buffer = new byte[4096];
ZipInputStream zin = new ZipInputStream(new FileInputStream(tmpZip));
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source));
for(int i = 0; i < files.length; i++){
InputStream in = new FileInputStream(files[i]);
out.putNextEntry(new ZipEntry(path + files[i].getName()));
for(int read = in.read(buffer); read > -1; read = in.read(buffer)){
out.write(buffer, 0, read);
}
out.closeEntry();
in.close();
}
for(ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()){
if(!zipEntryMatch(ze.getName(), files, path)){
out.putNextEntry(ze);
for(int read = zin.read(buffer); read > -1; read = zin.read(buffer)){
out.write(buffer, 0, read);
}
out.closeEntry();
}
}
out.close();
tmpZip.delete();
}catch(Exception e){
e.printStackTrace();
}
}
private boolean zipEntryMatch(String zeName, File[] files, String path){
for(int i = 0; i < files.length; i++){
if((path + files[i].getName()).equals(zeName)){
return true;
}
}
return false;
}
感谢链接最终能够改进该方法,以便它可以添加不在根目录中的文件,现在我是一个快乐的露营者:)希望这有助于其他人出去< / p>
修改强> 我在方法上做了一些工作,这样它不仅可以附加到zip上,而且还可以更新zip中的文件
使用这样的方法
File[] files = {new File("/path/to/file/to/update/in")};
addFilesToZip(new File("/path/to/zip"), files, "folder/dir/");
你不会用/启动路径(最后一个变量),因为它不是如何在zip条目中列出
答案 1 :(得分:2)
不幸的是,Java无法更新Zip文件。提交的请求已提交14 years ago; - )
您需要将其解压缩到临时文件夹,在那里添加文件并重新打包。