我如何用Java压缩一个包含所有子文件夹的完整目录?

问题描述 投票:0回答:2

嘿!在你去报告这个重复之前:我研究了几个小时,是的,有很多关于这方面的网站、问题和视频,但这些都不能帮助我。

我已经使用了不同的技术来创建 zip 存档,效果很好。我还可以毫无问题地从子目录中获取所有文件。但问题是我只得到列出的所有文件,没有它们的目录。如果我有

/something/somethingelse/text1.txt 和 /something/somethingother/lol.txt

我希望它完全像那样显示在 zip 文件夹中。

在 zip 文件夹中应该有 2 个文件夹 someelse 和 someother,包含它们的文件。对于我找到的所有版本,它将所有文件和其他子文件夹中的所有文件直接放入 zip 中,因此当我单击

.zip
时,它只显示
text1.txt
lol.txt
,没有任何文件夹。

有没有一种方法可以像所有众所周知的压缩文件程序一样处理

.zip

我只想压缩目录并保留以前的所有内容,只是打包到 zip 存档中。

我用我的java水平尝试了所有能做的事情,也尝试了一些在线版本,但没有任何结果是我想要的。

java zip
2个回答
13
投票

给你:

private static void zipFolder(Path sourceFolderPath, Path zipPath) throws Exception {
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath.toFile()));
   Files.walkFileTree(sourceFolderPath, new SimpleFileVisitor<Path>() {
       @Override
       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
           zos.putNextEntry(new ZipEntry(sourceFolderPath.relativize(file).toString()));
           Files.copy(file, zos);
           zos.closeEntry();
           return FileVisitResult.CONTINUE;
        }
    });
    zos.close();
 }

./

./别的东西/

./其他东西/


1
投票

此解决方案保留了创建的 zip 文件内的文件夹结构的层次结构 -

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipDirectories {

    public static void main(String[] args) throws IOException {
        zipDirectory(args[0], args[1]);
    }

    private static void zipDirectory(String zipFileName, String rootDirectoryPath) throws IOException {
        File directoryObject = new File(rootDirectoryPath);
        if (!zipFileName.endsWith(".zip")) {
            zipFileName = zipFileName + ".zip";
        }
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
        System.out.println("Creating : " + zipFileName);
        addDirectory(directoryObject, out);
        out.close();
    }

    private static void addDirectory(File directoryObject, ZipOutputStream out) throws IOException {
        File[] files = directoryObject.listFiles();
        byte[] tmpBuf = new byte[1024];

        for (File file : files) {
            if (file.isDirectory()) {
                addDirectory(file, out);
                continue;
            }
            FileInputStream in = new FileInputStream(file.getAbsolutePath());
            System.out.println(" Adding: " + file.getAbsolutePath());
            out.putNextEntry(new ZipEntry(file.getAbsolutePath()));
            int len;
            while ((len = in.read(tmpBuf)) > 0) {
                out.write(tmpBuf, 0, len);
            }
            out.closeEntry();
            in.close();
        }
    }
}

我参考了this链接来获取解决方案,它有效。

© www.soinside.com 2019 - 2024. All rights reserved.