Добавление файлов в ZIP-файл

Я пытаюсь добавить некоторые файлы в ZIP-файл, он создает файл, но ничего не добавляет в него. Код 1:

<code>String fulldate = year + "-" + month + "-" + day + "-" + min;

File dateFolder = new File("F:\\" + compname + "\\" + fulldate);
dateFolder.mkdir();

String zipName = "F:\\" + compname + "\\" + fulldate + "\\" + fulldate + ".zip";

zipFolder(tobackup, zipName);
</code>

Моя функция:

<code>public static void zipFolder(File folder, String name) throws Exception {
    byte[] buffer = new byte[18024];

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(name));
    FileInputStream in = new FileInputStream(folder);

    out.putNextEntry(new ZipEntry(name));

    int len;

    while((len = in.read(buffer)) > 0) {
        out.write(buffer, 0, len);
    }

    out.closeEntry();
    in.close();
    out.close();
}
</code>

Edit: Я обнаружил проблему, просто возникли проблемы при записи файлов с диска C: \ в ZIP на диске F: \

 Lukas Knuth11 апр. 2012 г., 12:18
Если вы хотите перебрать файлы в данной папке, используйтеlistFiles()-method вашейFile-объект.

Ответы на вопрос(2)

Смотрите такжеБиблиотека ZeroTurnaround's Zip, Имеет такие функции как (цитата):

pack and unpack directories recursively iterate through ZIP entries
Решение Вопроса

Вы не можете заархивировать папки, только файлы. Чтобы сжать папки, вы должны добавить все подфайлы вручную. Я написал этот класс, который делает работу. Вы можете получить его бесплатно :)

Использование будет следующим:

List<File> sources = new ArrayList<File>();
sources.add(tobackup);
Packager.packZip(new File(zipName), sources);

Вот класс:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Packager
{
    public static void packZip(File output, List<File> sources) throws IOException
    {
        System.out.println("Packaging to " + output.getName());
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(output));
        zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);

        for (File source : sources)
        {
            if (source.isDirectory())
            {
                zipDir(zipOut, "", source);
            } else
            {
                zipFile(zipOut, "", source);
            }
        }
        zipOut.flush();
        zipOut.close();
        System.out.println("Done");
    }

    private static String buildPath(String path, String file)
    {
        if (path == null || path.isEmpty())
        {
            return file;
        } else
        {
            return path + "/" + file;
        }
    }

    private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException
    {
        if (!dir.canRead())
        {
            System.out.println("Cannot read " + dir.getCanonicalPath() + " (maybe because of permissions)");
            return;
        }

        File[] files = dir.listFiles();
        path = buildPath(path, dir.getName());
        System.out.println("Adding Directory " + path);

        for (File source : files)
        {
            if (source.isDirectory())
            {
                zipDir(zos, path, source);
            } else
            {
                zipFile(zos, path, source);
            }
        }

        System.out.println("Leaving Directory " + path);
    }

    private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException
    {
        if (!file.canRead())
        {
            System.out.println("Cannot read " + file.getCanonicalPath() + " (maybe because of permissions)");
            return;
        }

        System.out.println("Compressing " + file.getName());
        zos.putNextEntry(new ZipEntry(buildPath(path, file.getName())));

        FileInputStream fis = new FileInputStream(file);

        byte[] buffer = new byte[4092];
        int byteCount = 0;
        while ((byteCount = fis.read(buffer)) != -1)
        {
            zos.write(buffer, 0, byteCount);
            System.out.print('.');
            System.out.flush();
        }
        System.out.println();

        fis.close();
        zos.closeEntry();
    }
}

Наслаждайтесь!

EDIT: Чтобы проверить, занята ли программа, вы можете добавить три строки, которые я пометил (*)

EDIT 2: Попробуйте новый код. На моей платформе он работает правильно (OS X). Я не уверен, но в AppData могут быть некоторые ограниченные права на чтение для файлов в Windows.

 11 апр. 2012 г., 12:29
+1 Хороший чувак!
 cheese550511 апр. 2012 г., 12:29
Подожди - Хм, странно. Это автоматически прекратилось само по себе без причины. & Quot;. Совершено & Quot; не появился.
 cheese550511 апр. 2012 г., 12:35
Ну, я сделал. Я экспортировал его и запустил через CMD, но он внезапно останавливается. Есть ли ограничение по времени? Вот последние данные, которые он отправляет: Выход из каталога David / AppData / Local / Apple Computer / Каталог добавления QuickTime David / AppData / Local / Apple Computer / WebKit Выходной каталог David / AppData / Local / Apple Computer / WebKit Выходящий каталог David / AppData / Local / Каталог компьютеров Apple: David / AppData / Local / Данные приложения C: \ Users \ David \ Desktop & gt;
 11 апр. 2012 г., 12:31
@ cheese5505: убедитесь, что вы даете программе необходимое время. Сжатие занимает некоторое время. Убедитесь, что приложение завершено, прежде чем пытаться открыть почтовый индекс. Вы можете добавитьSystem.out.print("."); в цикле сжатия, чтобы увидеть, занята ли программа или нет.
 cheese550511 апр. 2012 г., 12:23
Спасибо! Я посмотрю, как все пойдет! РЕДАКТИРОВАТЬ: Это выглядело хорошо, он сжал его (: D), но это явно недействительным. Ошибка: Сжатая (заархивированная) папка 'F: \ David-PC \ 2012-03-11-25 \ 2012-03-11-25.zip & apos; является недействительным.

Ваш ответ на вопрос