2015-03-27 2 views
1

Я как бы застрял в этой проблеме. Я хочу напечатать только каталог верхнего уровня из zip-файла. Например, у меня есть почтовый файл со следующей структурой:Java получить папку верхнего уровня из zip-файла

Sample.zip 
    - sound 
      - game 
       -start.wav 
       -end.wav 
      - Intro 
    - custom 
      - Scene 
       - fight 
      - Angle 
     .............. 

Над фигуры показывает: Sample.zip имеет 2 папки (звуковые и пользовательскую), так и внутри звука есть 2 папки игра и вводные и так далее .. .

Теперь я знаю, как открыть и захватить каталог из архива: для примера (рабочий код)

try { 
    appFile = ("../../Sample.zip"); // just the path to zip file 
    ZipFile zipFile = new ZipFile(appFile); 
    Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
    while (entries.hasMoreElements()) { 
     ZipEntry entry = entries.nextElement(); 
     if(entry.isDirectory()){ 
      String dir = entry.getName(); 
      File file = new File(dir); 
      System.out.println(file.getParent()); 
     } 
    } 
} catch (IOException e) { 
    System.out.println("Error opening Zip" +e); 
} 

Теперь я знаю, что я могу использовать .getParent() (как вы видите выше), чтобы получить верхнюю но вышеприведенная реализация не сработала. Это будет список из всех каталогов, например

null 
sound 
game 
null 
custom 
scene 
Angle 

Мой вопрос, как я могу на самом деле печатать только папки верхнего уровня, в приведенном выше сценарии, sound и custom?

Для любого намека я буду благодарен.

+0

@Ducan: Я обновил этот вопрос с тем, что не работает (выход). – Nepal12

+0

Начните с печати имени всех записей. Затем напечатайте только имя записей, которые являются каталогами. Теперь прочитайте вывод и попытайтесь найти, как можно отличить запись каталога верхнего уровня от записи каталога верхнего уровня. –

ответ

1

На самом деле я следующее, как было предложено @JB Nizet и получить работу вокруг (это на самом деле работает):

try { 
    appFile = ("../../Sample.zip"); // just the path to zip file 
    ZipFile zipFile = new ZipFile(appFile); 
    Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
    while (entries.hasMoreElements()) { 
     ZipEntry entry = entries.nextElement(); 
     if(entry.isDirectory()){ 
      File file = new File(entry.getName()); 
      if(file.getParent() == null){ 
       System.out.println(file.getName()); 
      } 
     } 
    } 
} catch (IOException e) { 
    System.out.println("Error opening Zip" +e); 
} 

выше решение имеет потому что у верхнего уровня нет родителя и поэтому возвращает значение null в качестве вывода. Поэтому я просто просматриваю каталоги, чтобы узнать, есть ли у них родители, если у них нет родителя, то они являются каталогом верхнего уровня.

+0

Это неверно. Это происходит только потому, что у вас нет каталога с именем sound или game в текущем каталоге. Вам не нужно использовать File. Просто удалите конечное '/' из имени и посмотрите, содержит ли в результате имя '/'. Если это не так, это каталог верхнего уровня. –

+0

@JBNizet: Извините, я не понял вашу логику. Не могли бы вы проиллюстрировать небольшой пример. – Nepal12

+0

'boolean isTopLevelDirectory (ZipEntry e) { return e.isDirectory() &&! E.getName(). Substring (0, e.getName(). Length() - 1) .contains ("/"); } ' –

1

Вы можете использовать что-то вроде этого:

try{ 
     String appFile = "../file.zip"; // just the path to zip file 
     ZipFile zipFile = new ZipFile(appFile); 
     Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
     while (entries.hasMoreElements()) { 
      ZipEntry entry = entries.nextElement(); 
      if(entry.isDirectory() && !entry.getName().matches("\\S+/\\S+")){ //it's a top level folder 
       System.out.println(entry.getName()); 
      } 
     } 
    } catch (IOException e) { 
     System.out.println("Error opening Zip" +e); 
    } 
+0

Извините, но в вашем решении будут перечислены все каталоги. – Nepal12

+0

Странно, потому что каталог «sound/game /» (from entry.getName()) содержит имя/в имени и его следует исключить из условия регулярного выражения –

+0

Да, я думал, что ваш ответ должен работать. Я решил это, хотя, тем не менее, то, что я сделал, это просто работа. – Nepal12

1

Может быть, этот код поможет вам с помощью InputStream

  String topFolder=""; 
      String topFolder2=""; 
      Boolean hasTopFolder=true; 
      try{ 
      File dir = new File(path+"/html5"+catalogue.getIdProduit()); 
      if (!dir.exists()) { 
       dir.mkdirs(); 
      } 
      String outputFolder= "path/to/outputFolder";  
      InputStream input = file.getInputstream(); 

      //get the zip file content 
      ZipInputStream zis = new ZipInputStream(input); 
      //get the zipped file list entry 

      ZipEntry ze = zis.getNextEntry(); 

      while(ze!=null){ 

       if (ze.isDirectory()) { 
        System.out.println("is directory : "+ ze.getName()); 
        if ("".equals(topFolder)){ 
         topFolder = ze.getName().split("/")[0];     
         System.out.println("is directory topFolder : "+ ze.getName()); 

        } 

        if (("".equals(topFolder2)) && (!topFolder.equals(ze.getName().split("/")[0]))){ 
         hasTopFolder=false; 
         topFolder2=ze.getName().split("/")[0]; 
         System.out.println("is directory topFolder2 : "+ ze.getName()); 
        } 
        ze = zis.getNextEntry();    
        continue; 

       } 

       String fileName = ze.getName(); 
       File newFile = new File(outputFolder + File.separator + fileName); 

       System.out.println("file unzip : "+ newFile.getAbsoluteFile()); 

       //create all non exists folders 
       //else you will hit FileNotFoundException for compressed folder 
       new File(newFile.getParent()).mkdirs(); 

       FileOutputStream fos = new FileOutputStream(newFile);    

       int len; 
       while ((len = zis.read(buffer)) > 0) { 
        fos.write(buffer, 0, len); 
       } 

       fos.close(); 
       ze = zis.getNextEntry(); 
       } 
       zis.closeEntry(); 
       zis.close(); 
       System.out.println("Done"); 
      } 
      catch(IOException e){ 
       e.printStackTrace(); 
      } 



      if (hasTopFolder){ 
       topFolder="/"+topFolder; 
      } 
      else 
       topFolder=""; 
Смежные вопросы