1

Javaを使用してファイルを圧縮/解凍する方法を学ぶためにこれを読んでいました。これをガイドとして使用し、フォルダー内のすべてのファイルを圧縮する場合はうまく機能しましたが、フォルダー内に複数のフォルダーを含むフォルダーでテストすると、機能せず、次のエラーがスローされました。

java.io.FileNotFoundException: assets (Access is denied) //assets is the name of the folder I tried to zip
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at Zip.main(Zip.java:24)

これは私が使用しているクラスです。前のリンクのコード サンプル 4: Zip.javaクラス コードと同じであることがわかります。

import java.io.*;
import java.util.zip.*;

public class Zip {
   static final int BUFFER = 2048;
   public void zip() {
      try {
         BufferedInputStream origin = null;
         FileOutputStream dest = new 
           FileOutputStream("H:\\myfigs.zip");
         CheckedOutputStream checksum = new 
           CheckedOutputStream(dest, new Adler32());
         ZipOutputStream out = new 
           ZipOutputStream(new 
             BufferedOutputStream(checksum));
         //out.setMethod(ZipOutputStream.DEFLATED);
         byte data[] = new byte[BUFFER];
         // get a list of files from current directory
         File f = new File(".");
         String files[] = f.list();

         for (int i=0; i<files.length; i++) {
            System.out.println("Adding: "+files[i]);
            FileInputStream fi = new 
              FileInputStream(files[i]);
            origin = new 
              BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(files[i]);
            out.putNextEntry(entry);
            int count;
            while((count = origin.read(data, 0, 
              BUFFER)) != -1) {
               out.write(data, 0, count);
            }
            origin.close();
         }
         out.close();
         System.out.println("checksum: "+checksum.getChecksum().getValue());
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
} 

このコードがフォルダー内のフォルダーとそのすべてのファイルを zip ファイルに圧縮できるようにするには、どのような変更を行う必要がありますか?

4

1 に答える 1

5

zip エントリは、アーカイブ内のファイルのパスを指定する必要があります。フォルダーを zip アーカイブに追加することはできません。フォルダー内のファイルのみを追加できます。

命名規則では、スラッシュをパス区切りとして使用します。次のファイル/サブディレクトリを含むフォルダーを圧縮する場合:

c:\foo\bar\a.txt
c:\foo\bar\sub1\b.txt
c:\foo\bar\sub2\c.txt

zip エントリ名は次のようになります。

a.txt
sub1/b.txt
sub2/c.txt

したがって、アルゴリズムを修正するには、for ループ内に isDirectory() を追加し、任意のサブディレクトリ内のファイルを再帰的に zip に追加します。おそらくこれを行う最良の方法は、メソッドを持つことです:

addDirectoryToZip(String prefix, File directory, ZipOutputStream out)

問題の解決策は次のとおりです。java.util.zip - ディレクトリ構造の再作成

于 2012-09-16T19:50:05.420 に答える