2012-04-11 14 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); 

My機能:

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

編集:は、私は、それだけでCからトラブルの書き込みファイルを持っていた問題を発見:\ FでZIPにドライブ: \ drive

+0

あなたは、指定したフォルダ内のファイルを反復処理する[ 'LISTFILESを使用したい場合() '-method](http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles())を参照してください。 –

答えて

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でマークされた3行を追加することができます確認するには。私のプラットフォームでは、それは正しく動作します(OS X)。私はわかりませんが、AppDataのWindowsのファイルに対する読み取り権限が制限されている可能性があります。

+0

ありがとう!私はそれがどのように行くか見るでしょう!編集:それは良い見えた、それを圧縮した(:D)が、それは明らかに無効です。エラー: 圧縮(zip)フォルダ 'F:\ David-PC \ 2012-03-11-25 \ 2012-03-11-25.zip'が無効です。 – cheese5505

+0

待って - うーん、奇妙。何の理由もなく自動的に終了します。 「完了」表示されませんでした。 – cheese5505

+1

+1よかった! – GingerHead

2

ZeroTurnaround's Zip libraryも参照してください。これは、(引用)などの機能を備えています。

  • パックやディレクトリを解凍再帰的
  • ZIPエントリを通じて
  • 反復