Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивная архивация папки в zip 
:(
    Опции темы
4epT
Дата 24.9.2011, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Добрый день! Есть задача заархивировать папку со всеми вложенными файлами. Рекурсия очень простая .. решил использовать библиотеку Apache Commons Compress. На данный момент сделано вот так:

Код

public static void createTarGzOfDirectory(String directoryPath, String tarGzPath) throws IOException {
        FileOutputStream fOut = null;
        BufferedOutputStream bOut = null;
        GzipCompressorOutputStream gzOut = null;
        ZipArchiveOutputStream tOut = null;
     
        try {
            fOut = new FileOutputStream(new File(tarGzPath));
            bOut = new BufferedOutputStream(fOut);
            gzOut = new GzipCompressorOutputStream(bOut);
            tOut = new ZipArchiveOutputStream(gzOut);
     
            addFileToZip(tOut, directoryPath, "");
        } finally {
            tOut.finish();
     
            tOut.close();
            gzOut.close();
            bOut.close();
            fOut.close();
        }
    }
    
    private static void addFileToZip(ZipArchiveOutputStream tOut, String path, String base) throws IOException {
        File f = new File(path);
        String entryName = base + f.getName();
        ZipArchiveEntry zipEntry = new ZipArchiveEntry(f, entryName);
     
        tOut.putArchiveEntry(zipEntry);
     
        if (f.isFile()) {
            IOUtils.copy(new FileInputStream(f), tOut);
     
            tOut.closeArchiveEntry();
        } else {
            tOut.closeArchiveEntry();
     
            File[] children = f.listFiles();
     
            if (children != null) {
                for (File child : children) {
                    addFileToZip(tOut, child.getAbsolutePath(), entryName + "/");
                }
            }
        }
    }


При запуске архивация происходит, но при распакове там получается просто один файл без расширения с именем как у папки для архивации.

Кто помжет подсказать что не так делаю ?

 P.s. по данной либе гуглил, но не одного примера не нашел (
PM MAIL   Вверх
dobrolub
Дата 25.9.2011, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



попробуй закомментировать GZipCompressorOutput...
Код

   try {
        fOut = new FileOutputStream(new File(tarGzPath));
        bOut = new BufferedOutputStream(fOut);

//        gzOut = new GzipCompressorOutputStream(bOut);
//        tOut = new ZipArchiveOutputStream(gzOut);

        tOut = new ZipArchiveOutputStream(bOut);

        addFileToZip(tOut, directoryPath, "");
    } finally {
        tOut.finish();

        tOut.close();
        gzOut.close();
        bOut.close();
        fOut.close();
    }


PM   Вверх
jk1
Дата 25.9.2011, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

При запуске архивация происходит, но при распакове там получается просто один файл без расширения с именем как у папки для архивации.


Попробовал код - вполне нормальный tar.gz архив делает. Есть подозрение, что тут дело в распаковщике - не все из них нормально понимают \ в качестве разделителя в пути. А ваш код под виндой будет использовать как раз их. Так что можно попробовать конвертировать путь для использовать / в качестве разделителя:

Код

  public static void createTarGzOfDirectory(String directoryPath, String tarGzPath) throws IOException {
        TarArchiveOutputStream out = null;
        try {
            out = new TarArchiveOutputStream(
                    new GzipCompressorOutputStream(
                            new BufferedOutputStream(
                                    new FileOutputStream(
                                            new File(tarGzPath)))));

            addFileToTarGz(out, directoryPath, new File(directoryPath).getParentFile().toURI());
        } finally {
            if (out != null) {
                out.finish();
                out.close();
            }
        }
    }


    private static void addFileToTarGz(TarArchiveOutputStream out, String path, URI base) throws IOException {
        File f = new File(path);
        String entryName = base.relativize(f.toURI()).getPath();
        TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);

        out.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
        out.putArchiveEntry(tarEntry);

        if (f.isFile()) {
            IOUtils.copy(new FileInputStream(f), out);
            out.closeArchiveEntry();
        } else {
            out.closeArchiveEntry();

            File[] children = f.listFiles();

            if (children != null) {
                for (File child : children) {
                    addFileToTarGz(out, child.getAbsolutePath(), base);
                }
            }
        }
    }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
4epT
Дата 25.9.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Отказался от - "GzipCompressorOutputStream" и все заработало.

Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.