我正在尝试使用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
答案 0 :(得分:0)
为Windows安装cygwin
或任何其他一组Unix实用程序,并调用tar
命令行应用程序。
答案 1 :(得分:0)
您需要使用不同的构造函数。如果您检查Java代码TarArchiveEntry
new TarArchiveEntry(file)
最终会进入new TarArchiveEntry(file, file.getPath())
所以,如果你使用new TarArchiveEntry(file, file.getName())
那将使它变得平坦