【问题标题】:Tar files under a folder without parent folder in javajava中没有父文件夹的文件夹下的tar文件
【发布时间】:2014-04-18 09:02:58
【问题描述】:

我在 c:\Docs\Desktop 下有以下文件结构

rootFolder
|_x1
  |_1.png
  |_2.png
|_x2

我必须遍历 rootFolder (x1, x2 ... xN) 的子文件夹并创建包含它们的 tar 文件。所以 x1.tar 应该有 1.png 和 2.png

for(String folder: rootFolder.list()) {
    File files = new File(rootFolder.getAbsolutePath() + "\\" + folder);
    for(File subfiles : files.listFiles()) {
        fileList.add(subfiles);
    }
    generateTar(fileList,files.getAbsolutePath() + ".tar");
}

我在 generateTar 方法中使用 org.apache.commons.compress.archivers

generateTarFile(List<File> fileList, String tarName) {

    File tarFile = new File(tarName);
    OutputStream out = new FileOutputStream(tarFile);

    TarArchiveOutputStream aos = (TarArchiveOutputStream) new ArchiveStreamFactory().createArchiveOutputStream("tar", out);

    for(File file : fileList) {
        TarArchiveEntry entry = new TarArchiveEntry(file);
        entry.setSize(file.length());
        aos.putArchiveEntry(entry);
        IOUtils.copy(new FileInputStream(file), aos);
        aos.closeArchiveEntry();
    }

    aos.finish();
    aos.close();
    out.close();
}

此方法创建一个具有相同文件夹名称的 tar 文件(例如 rootFolder 下的 x1.tar),但是 x1.tar 具有以下结构

x1.tar
|_Docs
  |_Desktop
    |_rootFolder
      |_x1
        |_1.png
        |_2.png

而不是

x1.tar
|_1.png
|_2.png

我怎样才能实现它?

【问题讨论】:

  • 好吧,你在 File 对象上调用 .getAbsolutePath(),这应该不会让你感到惊讶
  • 但 list() 只返回文件夹名称,而不是路径。要访问它,我必须使用 rootFolder.getAbsolutePath()
  • 如果你使用 Java 7,你可以使用 Path 代替;它有更多的设施来做你想做的事。

标签: java archive tar


【解决方案1】:

您可以在创建条目时使用文件名来实现这一点:

TarArchiveEntry entry = new TarArchiveEntry(file.getName());

【讨论】:

    【解决方案2】:

    如果您使用 TarArchiveEntry 构造函数,除了文件之外还接受名称,您可以设置条目的名称。但这意味着您不能仅从文件列表生成 tar:您需要在遍历目录树时以某种方式保存相对路径,或者在创建条目时计算相对路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多