2014-09-04 6 views
0

Я пытаюсь разархивировать некоторые файлы из zip-файла в распакованный каталог с той же файловой структурой, что и zipped-файл, но у меня возникают трудности с методом getNextEntry(). Кажется, он возвращает только файлы в заархивированном файле, а не папки, вызывающие FileNotFoundException, когда я пытаюсь создать файл в директории, которая не существует.Unzipping File не извлекает папки

Например, первый уровень моего архива, как следующее:

Folder 1 file2.txt Folder 2 Folder 3 file.txt

Когда я называю getNextEntry() первое, что возвращенное file.txt, вторая вещь, возвращенное Folder 1/file2.txt. Даже вложенные папки игнорируются. Однако это было раньше, но я не уверен, что я сделал, чтобы сломать его.

Файл, который я передаю, представляет собой файл с застежкой-молнией, расположенный во внутренней памяти. Любая помощь будет высоко ценится!

public boolean unZipAndEncrypt(File file) { 
    boolean isSuccess = false; 

    ZipInputStream zin = null; 
    try { 
     ZipFile zipFile = new ZipFile(file); 
     FileInputStream fin = new FileInputStream(file); 
     zin = new ZipInputStream(fin); 
     ZipEntry ze; 
     File contentDir = new File(bookDirectory, contentId); 
     while ((ze = zin.getNextEntry()) != null) { 
      String name = ze.getName(); 
      if (ze.isDirectory()) { 
       File dir = new File(contentDir, name); 
       dir.mkdirs(); 
       continue; 
      } 

      FileModel fileModel = new FileModel(zipFile.getInputStream(ze), name); 
      if (!ze.getName().contains("cp_index")) { 
       fileModel = encryptor.encrypt(fileModel); 
      } 
      File toWrite = new File(contentDir, fileModel.getFullPathName()); 
      toWrite.createNewFile(); 
      OutputStream fout = new FileOutputStream(toWrite); 
      try { 
       byte[] buffer = new byte[1024]; 
       int len = 0; 
       while ((len = fileModel.getInputStream().read(buffer)) != -1) { 
        fout.write(buffer, 0, len); 
       } 
      } finally { 
       fileModel.close(); 
       zin.closeEntry(); 
       fout.close(); 
      } 

     } 
     isSuccess = true; 
    } catch (FileNotFoundException e) { 
     Log.e(TAG, "", e); 
    } catch (IOException e) { 
     Log.e(TAG, "", e); 
    } finally { 
     file.delete(); 
     try { 
      zin.close(); 
     } catch (IOException e) { 
      Log.e(TAG, "", e); 
     } catch (NullPointerException e) { 
      Log.e(TAG, "", e); 
     } 
    } 
    return isSuccess; 
} 

ответ

1

Вы можете создать каталог перед созданием нового файла:

toWrite.getParentFile().mkdirs(); // do before createNewFile() 
+0

Теперь я чувствую себя как полный идиот. Не собираюсь признавать, сколько времени я потратил на это. Спасибо за помощь! –

Смежные вопросы