###概要
Javaで「zip4j」を使用した『パスワード付きzipファイルの解凍プログラム』を作成しています。
※zip4jのバージョンは、zip4j_1.3.2.jar
###到達目標
ディレクトリ単位で指定し、指定したディレクトリ内(※サブディレクトリまで含める)にある『パスワード付きzipファイル』を、あらかじめ設定したパスワードでパスワード検索を行い、合致した『パスワード付きzipファイル』のみ解凍し、指定の出力先ファルダに格納する。
###現状
○1つのファイルのみを指定した、『パスワード付きzipファイル』の解凍は完了しています。
○指定したディレクトリ内にある『パスワード付きzipファイル』は解凍は完了しています。
×サブディレクトリ以下の『パスワード付きzipファイル』の処理が行われていません。
×パスワードが合致しない『パスワード付きzipファイル』まで出力されてしまう(テキストの中身は空っぽです)。
###構成の概略
C:\testZip (←このディレクトリを指定)
|-1 (←1はディレクトリ)
| |--01.zip (←01はzipファイル、pwdは 01)
| --11.zip (←11はzipファイル、pwdは pwd)
|-2 (←2はディレクトリ)
| |--22.zip (←22はzipファイル、pwdは 22)
|
|-3.zip (←3はzipファイル、pwdは pwd)
|-4.zip (←4はzipファイル、pwdは pwd)
※ここで設定するパスワードは「pwd」
###出力結果
[D]
[/f]01.zip
[/f]11.zip
[D]
[/f]22.zip
[F]3.zip
[F]4.zip
ファイルリスト一覧では、ファイルの取得はできているが、実際の解凍処理は正しく行えていません。
実際の解凍先ファルダ「unzip」に出力されるファイルは、
3.txt (3.zipを解凍したもの)正常に解凍(テキストの中身も問題なし)
4.txt (4.zipを解凍したもの)※パスワードが違うため、テキストの中身は何もない状態です。
到達目標とする出力状態は、解凍先ファルダ「unzip」に以下の2つのファイルが出力されるのが望ましいです。
11.txt (11.zipを解凍したもの)
3.txt (3.zipを解凍したもの)
###該当のソースコード
import java.io.*;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
public class UnzipT1 {
public static void main(String args[]) {
System.out.println("対象ファイルを入力してください");
// コンソール入力によりファイルを指定
Console console = System.console();
String strIn = console.readLine();
// 出力先の指定
String destination = "C:\unzip";
// パスワードの指定
String password = "pwd";
/*
ファイル一覧の取得・出力表示
ファイルがあればzip解凍メソッド「zipthaw()」へ
ディレクトリの場合、サブディレクトリに移動
→サブディレクトでも同様の処理を行う
*/
File source = new File(strIn);
File filelist[] = source.listFiles();
if (filelist != null){
for (int i = 0; i < filelist.length; i++){
if (filelist[i].isFile()){
System.out.println("[F]" + filelist[i].getName());
zipthaw(filelist[i],destination,password);
}else if (filelist[i].isDirectory()){
System.out.println("[D]" + filelist[i].getName());
File subDir = filelist[i];
File subFileList[] = subDir.listFiles();
if (subFileList != null){
for(int k = 0; k < subFileList.length; k++){
if(subFileList[k].isFile()){
System.out.println(" [/f]" + subFileList[k].getName());
zipthaw(filelist[k],destination,password);
}else if(subFileList[k].isDirectory()){
System.out.println(" [/d]" + subFileList[k].getName());
}else{
System.out.println(" [/?]" + subFileList[k].getName());
}
}
}
}
}
}
}
//zipファイル解凍処理
public static File zipthaw(File zipFileIn,String fileOut,String pwd){
try{
ZipFile zipFile = 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件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/03 03:44