在 java 中使用 Apache 保存目录结构

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

我怎样才能

tar
一个目录并使用
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;
}
java apache tar archiving
2个回答
4
投票

你的问题在这里:

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

因为你把每个文件放在 tar 中,只有它的名字,而不是他的路径。

您需要将路径条目中的相对路径传递给此文件,而不是

file.getName()


0
投票

如果您要对文件执行完整目录路径,则该库的字符限制为 100 个字符。您需要为长路径修改 TarArchiveOutputStream。然后就可以了。

TarArchiveOutputStream tOut = new TarArchiveOutputStream(gzOut)) 
// set format to posix so it handles long file name paths
tOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
© www.soinside.com 2019 - 2024. All rights reserved.