如何在Windows中使用Java(apache compress)创建“有效”的unix TAR存档?

时间:2013-07-01 14:36:05

标签: gzip file-permissions apache-commons tar apache-commons-compress

我正在尝试使用apache commons compress librarys创建一个'有效'的tar.gz存档。创建的存档将由嵌入式设备读取,并且必须采用相同的格式,并且具有相同的文件权限。

如果我使用Linux来创建我的文件,一切正常,但如果我使用的是Windows。该文件被拒绝。

如您所见,存档仅包含具有unix权限的特殊文件。这些是正确设置的,如果我使用“工作”tar文件并通过gzip运行它,创建的tar.gz也可以正常工作。

我发现唯一的区别是,非工作tar文件略大(61而不是56 kb),7zip显示在“Host OS” FAT 而不是 Unix

任何想法,我如何从Windows创建“真正的”tar档案?

提前致谢!

我目前的源代码是:

public static void compress(File configTar, File rcConf, File databaseTxt)
        throws ArchiveException, IOException {

    OutputStream tarFileStream = new GZIPOutputStream(new FileOutputStream(configTar));
    InputStream rcConfStream = new FileInputStream(rcConf);
    InputStream databaseTxtStream = new FileInputStream(databaseTxt);

    ArchiveOutputStream archiveOutputStream = new ArchiveStreamFactory()
            .createArchiveOutputStream(ArchiveStreamFactory.TAR, tarFileStream);

    TarArchiveEntry databaseTxtEntry = new TarArchiveEntry(databaseTxt);
    TarArchiveEntry rcConfEntry = new TarArchiveEntry(rcConf);

    databaseTxtEntry.setName("database.txt");
    databaseTxtEntry.setGroupName("root");
    databaseTxtEntry.setUserName("root");
    databaseTxtEntry.setMode(convertModeFromString("rwxr-xr-x"));

    archiveOutputStream.putArchiveEntry(databaseTxtEntry);
    IOUtils.copy(databaseTxtStream, archiveOutputStream);
    archiveOutputStream.closeArchiveEntry();

    rcConfEntry.setName("rc.conf");
    rcConfEntry.setGroupName("root");
    rcConfEntry.setUserName("root");
    rcConfEntry.setMode(convertModeFromString("rw-rw-rw-"));

    archiveOutputStream.putArchiveEntry(rcConfEntry);
    IOUtils.copy(rcConfStream, archiveOutputStream);
    archiveOutputStream.closeArchiveEntry();

    archiveOutputStream.finish();

    rcConfStream.close();
    databaseTxtStream.close();
    tarFileStream.close();
}

我做了一些研究,发现TAR标题之间存在差异。谁能告诉我,我做错了什么?

Working example of file 1:
   http://i.stack.imgur.com/S8Rbi.jpg

NON-Working example of file 1:
   http://i.stack.imgur.com/bdc9T.jpg

Working example of file 2:
   http://i.stack.imgur.com/rYhr9.jpg

NON-Working example of file 2:
   http://i.stack.imgur.com/4wHw3.jpg

2 个答案:

答案 0 :(得分:0)

为Windows安装cygwin或任何其他一组Unix实用程序,并调用tar命令行应用程序。

答案 1 :(得分:0)

您需要使用不同的构造函数。如果您检查Java代码TarArchiveEntry

new TarArchiveEntry(file)最终会进入new TarArchiveEntry(file, file.getPath())

所以,如果你使用new TarArchiveEntry(file, file.getName())那将使它变得平坦