gpt4 book ai didi

java - 使用java在 "zipping"目录时添加了不必要的文件结构?

转载 作者:行者123 更新时间:2023-11-30 04:36:19 24 4
gpt4 key购买 nike

我的问题非常简单,是关于当我尝试压缩目录时意外的行为(或者至少对我来说是意外的),我有以下创建的方法我自己的(我很清楚我没有处理异常和所有这些东西,这是因为(现在)我这样做只是为了学习如何做到这一点,所以稳定性“并不真正重要”),在这里是代码:

public static void zipDirectory(File srcDirectory, File zipFile) throws IllegalArgumentException {
if (!srcDirectory.isDirectory()) {
throw new IllegalArgumentException("The first parameter (srcDirectory) MUST be a directory.");
}
int bytesRead;
byte[] dataRead = new byte[1000];
BufferedInputStream in = null;
ZipOutputStream zOut;
try {
zOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
for (File f : srcDirectory.listFiles()) {
if (f.isDirectory()) {
FileUtilities.zipInnerDirectory(f,zOut);
}else {
in = new BufferedInputStream(new FileInputStream(f.getAbsolutePath()), 1000);
zOut.putNextEntry(new ZipEntry(f.getPath()));
while((bytesRead = in.read(dataRead,0,1000)) != -1) {
zOut.write(dataRead, 0, bytesRead);
}
zOut.closeEntry();
}
}
zOut.flush();
zOut.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private static void zipInnerDirectory(File dir, ZipOutputStream zOut) throws IllegalArgumentException {
if (!dir.isDirectory()) {
throw new IllegalArgumentException("The first parameter (srcDirectory) MUST be a directory.");
}
BufferedInputStream in = null;
int bytesRead;
byte[] dataRead = new byte[1000];
try {
for (File f : dir.listFiles()) {
if (f.isDirectory()) {
FileUtilities.zipInnerDirectory(f,zOut);
}else {
in = new BufferedInputStream(new FileInputStream(f.getAbsolutePath()), 1000);
zOut.putNextEntry(new ZipEntry(f.getPath()));
while((bytesRead = in.read(dataRead,0,1000)) != -1) {
zOut.write(dataRead, 0, bytesRead);
}
zOut.closeEntry();
}
}
zOut.flush();
zOut.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

正如我所说,这不是我最好的编码,所以请不要评判代码(或者至少不要太严格;)),我知道它可以更好;好的,“意外行为”是这样的,假设我有以下目录:

  • H:\MyDir1\MyDir2\MyDirToZip

当我作为参数发送使用该路径创建的文件时(new File("H:\\MyDir1\\MyDir2\\MyDirToZip")),一切工作都很好,zip 已成功创建,问题是,当我打开(解压缩)zip 内的文件时,它们具有以下结构:

  • H:\MyDir1\MyDir2\MyDirToZip

当我期望找到里面的时候:

  • \MyDirToZip

没有 H:\MyDir1\MyDir2 这是“不必要的”(顺便说一句,它们只是以适当的顺序彼此包含一个,我的意思是,其中的其他文件没有被压缩,这就是为什么我说它们是不必要)所以问题是,我做错了什么?我如何指定我只想将结构压缩到srcDirectory

最佳答案

zOut.putNextEntry(new ZipEntry(f.getPath())); 

这应该是问题所在。 f.getPath() 将返回相对于某个根目录(可能是您当前的工作目录)的路径,但不相对于您正在压缩的目录。您需要找出一种从 zip 目录获取相对路径的方法,可能可以这样做:

new ZipEntry(f.getAbsolutePath().substring(zipDir.getAbsolutePath().length()))

或者,如果您想添加根目录:

new ZipEntry(zipDir.getName() + "/"
+ f.getAbsolutePath().substring(zipDir.getAbsolutePath().length()))

关于java - 使用java在 "zipping"目录时添加了不必要的文件结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13419979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com