Как создать "действительный" 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 приложение командной строки.

Другие вопросы по тегам