2012-02-15 17 views
4

可能性の重複:
Appending files to a zip file with JavaのJavaのzipにファイルを追加

I持ってそれにいくつかのフォルダが含まれていますが、重要なものは、DIRであり、その内の別のフォルダでのzipいわゆるフォルダとフォルダには、更新が必要なファイルがたくさん含まれています。

私はdirと呼ばれるジップの外側のdirを持っています。これは、パスが同じになるように更新する必要のあるファイルがあるフォルダです。これらのファイルをzipにどのように更新できますか?

dirはジップのルートにあり、フォルダだけでなく、多くのフォルダを含んでいますが、フォルダ内のファイルを更新する必要があります。フォルダがまだdirにあります。

これはできますか?私はこれがbashで-u修飾子を使って行うことができることを知っていますが、可能ならばjavaでこれを行うことを好むでしょう。

は/郵便番号 /ディレクトリ/フォルダの外

/ディレクトリ/フォルダ/ filestoupdateジップの内側だけ

より明確にするために、この問題

を持つ任意の助けてくれてありがとうfilestomoveintozip

+0

HTTPに記載されていない方法だとして、あなたが/とパス(最後の変数)を開始しません。この

File[] files = {new File("/path/to/file/to/update/in")}; addFilesToZip(new File("/path/to/zip"), files, "folder/dir/"); 

のようなメソッドを使用します:// stackoverflowの。com/questions/2223434/appending-files-to-a-zip-file-with-java –

答えて

8

これは最終的な方法ですが、これは私が実際にstackoverflowトピックから得たpastelistnedメソッドと同じです@Qweは前に投稿しましたが、パス変数を追加してzip内のフォルダにファイルを追加できるようにしました

さて今、私は別のフォルダ内に、私はこの

private void addFilesToZip(File source, File[] files, String path){ 
    try{ 
     File tmpZip = File.createTempFile(source.getName(), null); 
     tmpZip.delete(); 
     if(!source.renameTo(tmpZip)){ 
      throw new Exception("Could not make temp file (" + source.getName() + ")"); 
     } 
     byte[] buffer = new byte[4096]; 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(tmpZip)); 
     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source)); 
     for(int i = 0; i < files.length; i++){ 
      InputStream in = new FileInputStream(files[i]); 
      out.putNextEntry(new ZipEntry(path + files[i].getName())); 
      for(int read = in.read(buffer); read > -1; read = in.read(buffer)){ 
       out.write(buffer, 0, read); 
      } 
      out.closeEntry(); 
      in.close(); 
     } 
     for(ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()){ 
      if(!zipEntryMatch(ze.getName(), files, path)){ 
       out.putNextEntry(ze); 
       for(int read = zin.read(buffer); read > -1; read = zin.read(buffer)){ 
        out.write(buffer, 0, read); 
       } 
       out.closeEntry(); 
      } 
     } 
     out.close(); 
     tmpZip.delete(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

private boolean zipEntryMatch(String zeName, File[] files, String path){ 
    for(int i = 0; i < files.length; i++){ 
     if((path + files[i].getName()).equals(zeName)){ 
      return true; 
     } 
    } 
    return false; 
} 

のような問題のためのおかげで、私のセットアップを使用していることをするだろうされたフォルダにファイルを追加したい上記の私の例ではそれを使用する方法リンクは、その方法を少し改良して、ルートになかったファイルを追加できるようになりました。これは他の誰かアウトだけでなく

EDIT 、それがZIPに追加することができないだけではなく、またのzip内のファイルを更新することができるように、私はこの方法でもう少し仕事をするのに役立ちます願っています:)幸せなキャンピングカー

ことは、それがZIPエントリ

+0

renameToはWindowsでfalseを返しています。 –

2

残念ながら、JavaはZipファイルを更新できません。それを強化する要求は14 years ago ;-)

一時フォルダに解凍してそこにファイルを追加し、再度パックする必要があります。

+0

私はこのメソッドを既に持っているので、私はジップに追加できますが、ルートに追加することはできますが、実際にそれを改善するためにJavaで十分ではありませんが、ここではメソッドhttp://pastebin.com/APJWMwc3 – user577732

+0

私はzipを抽出してそれを再パックする問題は、ジップはそれに署名を持っているので、私は本当にできません私はそれを解凍してそれを解凍した後にそれを行うには – user577732

+0

リンクされた質問を見て - 彼らはTrueZipをお勧めします - 多分あなたの問題を解決することができますか? –

関連する問題