zipを解凍しようとせずに、Javaのzip4jライブラリを使用してzipファイルのパスワード修正を確認する方法はありますか?
よろしく
残念ながら、現在のバージョンの Zip4j ではこれを直接行うことはできません。私は現在 Zip4j を書き直しており、次のリリースにこの機能を含める予定です。
ただし、現在のバージョンでは、これに対する回避策があります。以下のコードを見てください。zip ファイルをメモリに読み込もうとすることができます。AES で暗号化された zip ファイルの場合は、すぐに ZipException と code を取得しますZipExceptionConstants.WRONG_PASSWORD
。標準の zip 暗号化の場合、パスワードの確認は簡単ではありません。入力パスワードが間違っている場合、Zip4j は CRC 例外をスローします。これはおそらくパスワードが間違っていることを意味しますが、zip ファイル内のデータが破損している可能性もあります
以下のコードがきれいなコードではないことはわかっていますが、残念ながら現時点ではこれが唯一の方法です。Zip4j の次のバージョンには、パスワードを確認する優れた機能が含まれます。
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.exception.ZipExceptionConstants;
import net.lingala.zip4j.model.FileHeader;
public class VerifyPassword {
public static void verify() {
try {
ZipFile zipFile = new ZipFile(new File("myZip.zip"));
if (zipFile.isEncrypted()) {
zipFile.setPassword(new char[] {'t', 'e', 's', 't'});
}
List<FileHeader> fileHeaders = zipFile.getFileHeaders();
for(FileHeader fileHeader : fileHeaders) {
try {
InputStream is = zipFile.getInputStream(fileHeader);
byte[] b = new byte[4 * 4096];
while (is.read(b) != -1) {
//Do nothing as we just want to verify password
}
is.close();
} catch (ZipException e) {
if (e.getCode() == ZipExceptionConstants.WRONG_PASSWORD) {
System.out.println("Wrong password");
} else {
//Corrupt file
e.printStackTrace();
}
} catch (IOException e) {
System.out.println("Most probably wrong password.");
e.printStackTrace();
}
}
} catch (Exception e) {
System.out.println("Some other exception occurred");
e.printStackTrace();
}
}
public static void main(String[] args) {
verify();
}
}