質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

7244閲覧

zip4jを使ったパスワード付きzipファイルの解凍について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2017/10/01 07:23

###概要
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

課題1の方だけ回答

1,プログラムコードはコードタグで囲ってくださいな。
2,質問文の4.zipのパスワードがpwdになってますが、これだと4.zipも解凍対象になりますが。
3,

課題1

サブディレクトリ以下の解凍処理が行われない。

この点

Java

1for(int k = 0; k < subFileList.length; k++){ 2 if(subFileList[k].isFile()){ 3 System.out.println(" [/f]" + subFileList[k].getName()); 4 zipthaw(filelist[k],destination,password);// ←subFileListを引数に渡してません。

subFileListのループ内でzipthawメソッドを呼び出し部分の引数をsubFileListに変更すれば修正できます。

元ソースとかなり違いますが、再帰呼出しを使用したディレクトリの処理方法です。
ご参考まで。

Java

1 2import java.io.*; 3import net.lingala.zip4j.core.ZipFile; 4import net.lingala.zip4j.exception.ZipException; 5import java.util.Scanner; 6 7public class UnzipT1 { 8 private final String destination = "C:\unzip"; // 出力先の指定 9 private char[] password = "pwd".toCharArray(); // パスワードの指定 10 11 public UnzipT1() { 12 13 } 14 15 public static void main(String args[]) { 16 System.out.println("対象ファイルを入力してください"); 17 // コンソール入力によりファイルを指定 18 try (Scanner in = new Scanner(System.in)) { 19 String strIn = in.nextLine(); 20 UnzipT1 unzip = new UnzipT1(); 21 File source = new File(strIn); 22 unzip.search(source); 23 } 24 } 25 26 public void search(File source) throws RuntimeException { 27 for (File f : source.listFiles()) { 28 if (f.isFile()) { 29 System.out.println("[F]" + f.getName()); 30 zipthaw(f, destination, password); 31 continue; 32 } 33 if (f.isDirectory()) { 34 System.out.println("[D]" + f.getName()); 35 // 再帰呼出し 36 search(f); 37 continue; 38 } 39 } 40 } 41 42 // zipファイル解凍処理 43 public File zipthaw(File zipFileIn, String fileOut, char[] pwd) { 44 try { 45 ZipFile zipFile = new ZipFile(zipFileIn); 46 System.out.println(zipFileIn); 47 System.out.println(fileOut); 48 // パスワード付きのzipファイルの場合、指定のパスワードを割り当てる 49 if (zipFile.isEncrypted()) { 50 zipFile.setPassword(pwd); 51 } 52 // 出力先への書き出し 53 zipFile.extractAll(fileOut); 54 55 } catch (ZipException e) { 56 // エラーの出力表示(いまは、便宜上一時的に非表示) 57 //e.printStackTrace(); 58 } 59 return zipFileIn; 60 } 61}

◆変更点
1,System.console→java.util.Scannerに変更
2,searchメソッドを追加
3,zipthawメソッドを静的メソッドからインスタンスメソッドに
4,setPassword(String)はセキュリティ上の問題があるので、char[]に変更
setPassword(String)

投稿2017/10/02 19:34

umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/03 03:44

umyuさん、ご回答いただきまして、ありがとうございます。 再帰処理による対処方法を理解することができました。 課題2につきましては、その後いくつか関連する情報を見つけたことと、 また場合により、出力先で「空のファイル」を検索し、該当する「空のファイル」は削除するといった処置を加えることで対処しようと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問