2016-12-30 3 views
0

У меня есть следующий каталог на моем ноутбуке:Сохраняя рекурсивную структуру каталогов в молниях с Java 8

/tmp/ 
    myapp/ 
     assets/ 
      config.yml 
      models/ 
       troll.ply 
       tree.ply 
      textures/ 
       troll-skin.png 
       tree-skin.png 

Я хотел бы, чтобы пронестись /tmp/myapp/assets (и весь его рекурсивные содержимое) до в ZIP с именем assets.zip, таким образом, что , когда я разархивирую его (через unzip assets.zip), он сохраняет структуру каталогов в папке assets. Следовательно, при распаковке он будет показывать config.yml в «корне» ZIP и 2 каталогах внутри ZIP (models и textures). Остальные файлы будут находиться внутри этих соответствующих подкаталогах и т.д.

Когда я запускаю этот код:

File sourceDir = new File("/tmp/myapp/assets"); 
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/Users/myuser/archives/assets.zip")); 

File[] contents = sourceDir.listFiles(); 
for(File file : contents) { 
    zip.putNextEntry(new ZipEntry(file.name)); 
    InputStream isteam = new FileInputStream(file); 

    Files.copy(isteam, zip); 
    zip.closeEntry(); 
    isteam.close(); 
} 

zip.close(); 

код правильно создает ZIP в /Users/myuser/archives/assets.zip.

Однако, когда я распаковать его (unzip /Users/myuser/archives/assets.zip), а затем запустить ls -al /Users/myuser/archives, мой вывод:

-rw-r--r-- 1 myuser 1754083733 492 Dec 30 14:14 assets.zip 
-rw-r--r-- 1 myuser 1754083733 10 Dec 30 14:14 config.yml 
-rw-r--r-- 1 myuser 1754083733 7 Dec 30 14:14 models 
-rw-r--r-- 1 myuser 1754083733 9 Dec 30 14:14 textures 

Так как models и textures лечитесь как файлы (не как каталоги). Кроме того, когда я заглядываю в содержимое файла «models», кажется, что содержимое troll.ply и tree.ply были объединены внутри него, а также для «tree файла» с 2 PNG.

Как я могу настроить это, чтобы структура каталогов (независимо от того, насколько глубоко/вложен) всегда сохраняется в результирующем ZIP-файле?

+0

Там нет рекурсии в коде ... – Holger

ответ

1

вы можете, вероятно, использовать рекурсивный вызов метода, чтобы сохранить структуру подкаталогов:

private static void addDir(File sourceDir, ZipOutputStream zip) throws IOException { 
    File[] contents = sourceDir.listFiles(); 
    for(File file : contents) { 
     if(file.isDirectory()){ 
      addDir(file, zip); 
     } else { 
      zip.putNextEntry(new ZipEntry(file.getAbsolutePath().replace("/tmp/myapp/",""))); 
      System.out.println("file name " + file.getAbsolutePath().replace("/tmp/myapp/","")); 
      Path rn_demo = Paths.get(String.valueOf(file)); 
      Files.copy(rn_demo, zip); 
     } 
    } 
    zip.closeEntry(); 
} 

и вы звоните в основном методе, как показано ниже:

public static void main(String[] args) throws IOException { 
    File sourceDir = new File("/tmp/myapp/assets"); 
    ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/Users/myuser/archives/assets.zip")); 
    addDir(sourceDir, zip); 
    zip.close(); 
} 
+0

Спасибо @Sasi (+1) ваше решение ** появляется ** для работы во время выполнения, но когда я иду разархивировать ZIP-файл из командной строки, я получаю следующую ошибку: 'Archive: assets.zip End-of подпись -central-directory не найдена. Либо этот файл не является zipfile, либо представляет собой один диск из многочастного архива. В последнем случае центральный каталог и комментарий zipfile будут найдены на последнем диске (дисках) этого архива. unzip: не удается найти каталог zipfile в одном из assets.zip или assets.zip.zip и не может найти assets.zip.ZIP, period ... ' – smeeb

+0

Я заметил, что вы не закрываете ZIP-записи в любом месте (' zip.closeEntry() '), может быть, проблема? – smeeb

+0

@smeeb: как вы распаковываете файл? у меня нет проблем. вы можете набрать файл «yourfilename» из вашей строки cmd (это даст тип файла, если он OSX или * inux-системы) –

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

  • Нет связанных вопросов^_^