用Java实现Apache目录保持结构

2hh7jdfx  于 2023-03-19  发布在  Apache
关注(0)|答案(2)|浏览(104)

如何使用org.apache.commons.compress库创建目录并保留目录结构?
有了我在下面所做的,我只是得到了一个包,有一切扁平。
谢谢!
这是我一直在尝试的,但没有效果。

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;
}
wgmfuz8q

wgmfuz8q1#

你的问题就在这里:

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

因为您在tar中只使用文件名而不是路径来放置每个文件。
您需要将路径条目中的相对路径而不是file.getName()传递到此文件。

7gs2gvoe

7gs2gvoe2#

如果你使用的是文件的完整目录路径,那么这个库的字符限制是100个字符。你需要修改TarArchiveOutputStream来获得更长的路径。这样就可以了。

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

相关问题