2016-07-03 82 views
0

我想獲取壓縮文件的內容而不提取它。我使用ZipFile來獲取條目。但我觀察到的是,它以文件格式(如system/app.apk)給出zip文件夾中的所有文件,而不是將系統作爲目錄(例如file.listFiles()如何提供)。我如何獲得目錄結構格式的文件?Android視圖壓縮文件不提取

郵編結構:

ZipFolder.zip - system (folder) -> app.apk(file) 

       - meta (folder) -> manifest(folder) -> new.apk (file) 

代碼:

ZipFile zipFile = new ZipFile(mPath); 
    Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
     while(entries.hasMoreElements()) { 
      // below code returns system/app.apk and meta/manifest/new.apk 
      // instead of system,meta folders 
      ZipEntry entry = entries.nextElement(); 
      String fileName = entry.getName(); 
      boolean isDirectory = entry.isDirectory(); //returns false 
     } 

回答

0

試試下面的方法(見下文)來獲取一個zip文件的文件清單。

請注意:

  • 目錄名稱用作鍵。
  • 對於特定的目錄名稱,文件名存儲在List<String>中。
  • 如果文件沒有存儲在目錄中,我們將添加到默認的root密鑰。

public HashMap<String, List<String>> retrieveListing(File zipFile) { 
    HashMap<String, List<String>> contents = new HashMap<>(); 
    try { 
     FileInputStream fin = new FileInputStream(zipFile); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 
     while ((ze = zin.getNextEntry()) != null) { 
      if(ze.isDirectory()) { 
       String directory = ze.getName(); 
       if (!contents.containsKey(directory)) { 
        contents.put(directory, new ArrayList<String>()); 
       } 
      } else { 
       String file = ze.getName(); 
       int pos = file.lastIndexOf("/"); 
       if (pos != -1) { 
        String directory = file.substring(0, pos+1); 
        String fileName = file.substring(pos+1); 
        if (!contents.containsKey(directory)) { 
         contents.put(directory, new ArrayList<String>()); 
         List<String> fileNames = contents.get(directory); 
         fileNames.add(fileName); 
        } else { 
         List<String> fileNames = contents.get(directory); 
         fileNames.add(fileName); 
        } 
       } else { 
        if (!contents.containsKey("root")) { 
         contents.put("root", new ArrayList<String>()); 
        } 
        List<String> fileNames = contents.get("root"); 
        fileNames.add(file); 
       } 
      } 
      zin.closeEntry(); 
     } 
     zin.close(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    return contents; 
}