質問: new ZipFile(zipFileIn); //パスワード付きのzipファイルの場合、指定のパスワードを割り当てる if (zipFile.isEncrypted()){ zipFile.setPassword(pwd); } //出力先への書き出し zipFile.extractAll(fileOut); }catch(ZipException e){ //エラーの出力表示(いまは、便宜上一時的に非表示) // e.printStackTrace(); } return zipFileIn; } } ### まとめ 課題1 サブディレクトリ以下の解凍処理が行われない。 課題2 解凍ができなかったファイルまで出力されてしまう。 ### 参考情報 https://shinodogg.com/?p=4601 http://javadox.com/net.lingala.zip4j/zip4j/1.3.2/net/lingala/zip4j/core/ZipFile.html
回答: **課題1の方だけ回答** 1,プログラムコードはコードタグで囲ってくださいな。 2,質問文の4.zipのパスワードがpwdになってますが、これだと4.zipも解凍対象になりますが。 3, > > 課題1 > > サブディレクトリ以下の解凍処理が行われない。 > > > この点 ``` for(int k = 0; k < subFileList.length; k++){ if(subFileList[k].isFile()){ System.out.println(" [/f]" + subFileList[k].getName()); zipthaw(filelist[k],destination,password);// ←subFileListを引数に渡してません。 ``` > > subFileListのループ内でzipthawメソッドを呼び出し部分の引数をsubFileListに変更すれば修正できます。 元ソースとかなり違いますが、再帰呼出しを使用したディレクトリの処理方法です。 ご参考まで。 ``` import java.io.*; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import java.util.Scanner; public class UnzipT1 { private final String destination = "C:\\unzip"; // 出力先の指定 private char[] password = "pwd".toCharArray(); // パスワードの指定 public UnzipT1() { } public static void main(String args[]) { System.out.println("対象ファイルを入力してください"); // コンソール入力によりファイルを指定 try (Scanner in = new Scanner(System.in)) { String strIn = in.nextLine(); UnzipT1 unzip = new UnzipT1(); File source = new File(strIn); unzip.search(source); } } public void search(File source) throws RuntimeException { for (File f : source.listFiles()) { if (f.isFile()) { System.out.println("[F]" + f.getName()); zipthaw(f, destination, password); continue; } if (f.isDirectory()) { System.out.println("[D]" + f.getName()); // 再帰呼出し search(f); continue; } } } // zipファイル解凍処理 public File zipthaw(File zipFileIn, String fileOut, char[] pwd) { try { ZipFile zipFile = new ZipFile(zipFileIn); System.out.println(zipFileIn); System.out.println(fileOut); // パスワード付きのzipファイルの場合、指定のパスワードを割り当てる if (zipFile.isEncrypted()) { zipFile.setPassword(pwd); } // 出力先への書き出し zipFile.extractAll(fileOut); } catch (ZipException e) { // エラーの出力表示(いまは、便宜上一時的に非表示) //e.printStackTrace(); } return zipFileIn; } } ``` ◆変更点 1,System.console→java.util.Scannerに変更 2,searchメソッドを追加 3,zipthawメソッドを静的メソッドからインスタンスメソッドに 4,setPassword(String)はセキュリティ上の問題があるので、char[]に変更 setPassword(String))