名前の末尾に「/」が付いていないディレクトリが記述されているファイルの解凍に問題があります。
ファイルの内容が次の場合、コードは正常に機能します。
BASEDIR/
BASEDIR/file1.txt
BASEDIR/file2.txt
中央ディレクトリの名前の末尾に「/」が含まれていない場合、エラーが発生しました。この場合、zip ファイルの内容は次のとおりです。
BASEDIR
BASEDIR/file1.txt
BASEDIR/file2.txt
ここで、ファイルを解凍するために使用したコード
public static
void unzip(final String zipFilename, final String unzipDir)
throws ZipException {
ZipFile zipFile = null;
try {
final File directory = new File(unzipDir);
// Check if the directory to extract to exists
if(!directory.exists()) {
// If not, create a new one.
new File(unzipDir).mkdir();
}
final File checkFile = new File(zipFilename);
if (checkFile.length() == 0) {
throw new IOException("Empty file");
}
zipFile = new ZipFile(zipFilename);
Enumeration<?> e = zipFile.entries();
while(e.hasMoreElements()) {
final ZipEntry entry = (ZipEntry)e.nextElement();
final File destinationFile = new File(unzipDir,entry.getName());
//create directories if required.
destinationFile.getParentFile().mkdirs();
//if the entry is directory, leave it. Otherwise extract it.
if(entry.isDirectory()) {
continue;
}
else {
// Get the InputStream for current entry of the zip file using
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(destinationFile);
writeFile(is, fos);
}
}
}
catch(Exception ex) {
throw new ZipException("error", ex);
}
finally {
if(zipFile!=null) {
try {
zipFile.close();
}
catch(Exception ex) {
throw new ZipException("error", ex);
}
}
}
}
問題は、zip 内のエントリの名前が「/」で終わる場合にのみ機能する ZipEntry.isDirectory() メソッドであることがわかりました ( http://docs.oracle.com/javase/6/docs/api/java/ util/zip/ZipEntry.html#isDirectory%28%29 )、2 番目のシナリオでは機能しません。この動作の修正を見つけることができません。isDirectory メソッドを使用せずにエントリがディレクトリかどうかを確認するにはどうすればよいですか? (サードパーティのライブラリは使えませんのでご注意ください)