2012-04-11 8 views
1

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

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); 

Моя функция:

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(); 
} 

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

+0

Если вы хотите перебрать файлы в данной папке, используйте [ 'listFiles() '-method] (http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles()) вашего файла' File'. –

ответ

14

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

Использование бы это:

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). Я не уверен, но могут быть ограниченные права доступа для файлов в Windows в AppData.

+0

Спасибо! Я посмотрю, как это происходит! EDIT: он выглядел хорошо, он сжимал его (: D), но он явно недействителен. Ошибка: Сжатая (застегнутая молния) папка «F: \ David-PC \ 2012-03-11-25 \ 2012-03-11-25.zip» недействительна. – cheese5505

+0

Подождите - Хм, странно. Он автоматически прекратился без каких-либо причин. "Готово." не появился. – cheese5505

+1

+1 Хороший один чувак! – GingerHead

2

См. Также ZeroTurnaround's Zip library. Он имеет такие функции, как (цитата):

  • пакет и распаковать каталоги рекурсивно
  • итерации через записи ZIP