Мне известно, что Oracle отмечает методы сжатия/распаковки файлов ZIP/GZIP на своем веб-сайте. а>. Но у меня есть сценарий, в котором мне нужно сканировать и выяснить, задействованы ли какие-либо вложенные ZIP/RAR. Например, следующий случай:
-MyFiles.zip
-MyNestedFiles.zip
-MyMoreNestedFiles.zip
-MoreProbably.zip
-Other_non_zips
-Other_non_zips
-Other_non_zips
Я знаю, что пакет сжатия apache commons и java.util.zip являются широко используемыми пакетами, где сжатие commons фактически обслуживает отсутствующие функции в java.util.zip, например. некоторые настройки символов при выполнении zipouts. Но в чем я не уверен, так это в утилитах для рекурсии через вложенные zip-файлы, и ответы, предоставленные на SO, не являются очень хорошими примерами этого. Я попробовал следующий код (который я получил из блога Oracle), но, как я и подозревал, рекурсия вложенного каталога терпит неудачу, потому что она просто не может найти файлы:
public static void processZipFiles(String pathName) throws Exception{
ZipInputStream zis = null;
InputStream is = null;
try {
ZipFile zipFile = new ZipFile(new File(pathName));
String nestPathPrefix = zipFile.getName().substring(0, zipFile.getName().length() -4);
for(Enumeration e = zipFile.entries(); e.hasMoreElements();){
ZipEntry ze = (ZipEntry)e.nextElement();
if(ze.getName().contains(".zip")){
is = zipFile.getInputStream(ze);
zis = new ZipInputStream(is);
ZipEntry zentry = zis.getNextEntry();
while (zentry!=null){
System.out.println(zentry.getName());
zentry = zis.getNextEntry();
ZipFile nestFile = new ZipFile(nestPathPrefix+"\\"+zentry.getName());
if (zentry.getName().contains(".zip")) {
processZipFiles(nestPathPrefix+"\\"+zentry.getName());
}
}
is.close();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(is != null)
is.close();
if(zis!=null)
zis.close();
}
}
Может я что-то не так делаю или использую не те утилиты. Моя цель - определить, есть ли у каких-либо файлов или вложенных zip-файлов расширения файлов, которые я не разрешаю. Это сделано для того, чтобы я мог запретить своим пользователям загружать запрещенные файлы, даже когда они их архивируют. У меня также есть возможность использовать Tika, который может выполнять рекурсивный анализ (используя решение Zukka Zitting), но я не уверен, смогу ли я использовать метаданные для этого обнаружения, как я хочу.
Любая помощь/предложение приветствуется.