Как создать "действительный" unix TAR Archive в Windows с Java (сжатие apache)?
Я пытаюсь создать "действительный" архив tar.gz, используя библиотеки сжатия Apache Commons. Созданный архив будет прочитан встроенным устройством и должен быть в том же формате с теми же правами доступа к файлам, я думаю.
Если я использую Linux для создания моего файла, все работает нормально, но если я использую Windows. Файл отклонен.
Как видите, архив содержит только специальные файлы с разрешениями Unix. они правильно установлены, и если я использую "рабочий" tar-файл и запускаю его через gzip, созданный tar.gz также работает нормально.
Единственное отличие, которое я обнаружил, заключается в том, что нерабочий tar-файл немного больше (61 вместо 56 КБ) и 7zip отображается под FAT "Host OS" вместо Unix.
Любые идеи, как я могу создать "настоящий" архив tar из Windows?
Заранее спасибо!
Мой текущий исходный код:
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:
https://stackru.com/images/6d52e9fa7a41a019c6761e92b19a9fbd051aaddf.jpg
NON-Working example of file 1:
https://stackru.com/images/d1a1153c354bdd606b21691e5ecc182be70f20ed.jpg
Working example of file 2:
https://stackru.com/images/0046d18e734ab4110caefcf74f51414fb68cdf2c.jpg
NON-Working example of file 2:
https://stackru.com/images/2eb9a0dc53e1912a5a0621fa7522c8767b0b9893.jpg
2 ответа
Вам нужно использовать другой конструктор. Я проверяю JavaCode TarArchiveEntry
new TarArchiveEntry(file)
в конечном итоге в new TarArchiveEntry(file, file.getPath())
так что, если вы используете new TarArchiveEntry(file, file.getName())
это сделает его плоским
Устанавливать cygwin
или любой другой набор утилит Unix для Windows и вызова tar
приложение командной строки.