Tar 一个在 java 中使用 Apache 的目录保留结构



如何使用org.apache.commons.compresstar目录并保留目录结构?

通过我在下面所做的,我只是得到了一个将所有内容都扁平化的包。

谢谢!


这是我一直在尝试的,但它不起作用。

public static void createTar(final String tarName, final List<File> pathEntries) throws IOException {
    OutputStream tarOutput = new FileOutputStream(new File(tarName));
    ArchiveOutputStream tarArchive = new TarArchiveOutputStream(tarOutput);
    List<File> files = new ArrayList<File>();
    for (File file : pathEntries) {
        files.addAll(recurseDirectory(file));
    }
    for (File file : files) {
        TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(file, file.getName());
        tarArchiveEntry.setSize(file.length());
        tarArchive.putArchiveEntry(tarArchiveEntry);
        FileInputStream fileInputStream = new FileInputStream(file);
        IOUtils.copy(fileInputStream, tarArchive);
        fileInputStream.close();
        tarArchive.closeArchiveEntry();
    }
    tarArchive.finish();
    tarOutput.close();
}
public static List<File> recurseDirectory(final File directory) {
    List<File> files = new ArrayList<File>();
    if (directory != null && directory.isDirectory()) {
        for (File file : directory.listFiles()) {
            if (file.isDirectory()) {
                files.addAll(recurseDirectory(file));
            } else {
                files.add(file);
            }
        }
    }
    return files;
}

你的问题在这里:

TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(file, file.getName());

因为您将每个文件仅包含其名称而不是其路径放在 tar 中。

您需要将路径条目中的相对路径传递到此文件,而不是 file.getName()

如果您正在对文件进行完整目录路径,则库的字符限制为 100 个字符。 您需要修改长路径的 TarArchiveOutputStream。 然后它起作用了。

TarArchiveOutputStream tOut = new TarArchiveOutputStream(gzOut)) 
// set format to posix so it handles long file name paths
tOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);

最新更新