2016-12-08 3 views
0

У меня есть созданный каталог с некоторыми изображениями, хранящимися в нем. Теперь, чтобы пронестись его в виде отдельного файла .zip, я использовал следующий код:Android Zipping files

private static void zipDir(String zipFileName, String dir) throws Exception { 
    File dirObj = new File(dir); 
    ZipOutputStream out = new ZipOutputStream(newFileOutputStream(zipFileName)); 
    addDir(dirObj, out); 
    out.close(); 
} 

static void addDir(File dirObj, ZipOutputStream out) throws IOException { 
    File[] files = dirObj.listFiles(); 
    byte[] tmpBuf = new byte[1024]; 

    for (int i = 0; i < files.length; i++) { 
     if (files[i].isDirectory()) { 
     addDir(files[i], out); 
     continue; 
    } 
    FileInputStream in = new FileInputStream(files[i].getAbsolutePath()); 
    System.out.println(" Adding: " + files[i].getAbsolutePath()); 
     out.putNextEntry(new ZipEntry(files[i].getAbsolutePath())); 
     int len; 
     while ((len = in.read(tmpBuf)) > 0) { 
     out.write(tmpBuf, 0, len); 
     } 
     out.closeEntry(); 
     in.close(); 
    } 
    } 

Я получил этот код из следующего источника: http://www.java2s.com/Code/Java/File-Input-Output/Makingazipfileofdirectoryincludingitssubdirectoriesrecursively.htm

Когда я запускаю этот код, в указанном каталоге, .zip-файл создается с указанным именем, но когда я пытаюсь открыть его с помощью любого программного обеспечения (winzip и т. д.) на Android или на ПК, оно отображает сообщение об ошибке: Этот файл поврежден или недействительный почтовый файл «

Любая помощь будет принята.

+0

Я думаю ZipEntry должно быть имя файла, а не путь. Попробуйте следующее: новый ZipEntry (файлы [i] .substring (файлы [i] .lastIndexOf ("/") + 1)); – Hahn

ответ

0

Я думал об удалении вопроса. Но это означает довольно интересное чтение. При создании файла .zip я указал тот же каталог, что и тот, который я хотел сжать. Это приводит к бесконечному циклу. Проблема с изменением каталога .zip.

+0

Этот код не является хорошей практикой. Исключить целевой zip-файл лучше или вы можете сначала создать список файлов, а затем zip – reker

+0

извините; Я не мог понять. Не могли бы вы уточнить, пожалуйста? –

0

Я имею в виду, как это:

private static void zipDir(String zipFileName, String dir) throws Exception { 
    List<String> files = buildFileList(dir, ""); 
    ZipOutputStream out = new ZipOutputStream(newFileOutputStream(zipFileName)); 
    zipFiles(files, out); 
    out.close(); 
} 

static List<String> buildFileList(String path, String filter) { 
    List<String> lstFile = new ArrayList<String>(); 
    File[] files = new File(path).listFiles(); 

    if (files != null) { 
     for (int i = 0; i < files.length; i++) { 
      File f = files[i]; 
      if (f.isFile()) { 
       if (filter.length() == 0 || f.getName().matches(filter)) 
        lstFile.add(f.getAbsolutePath()); 

      } else if (f.isDirectory() && f.getPath().indexOf("/.") == -1) 
       lstFile.addAll(getFilePaths(f.getAbsolutePath(), filter)); 
     } 
    } 
    return lstFile; 
} 

static void zipFiles(List<String> files, ZipOutputStream out) throws IOException { 
    byte[] tmpBuf = new byte[1024]; 

    for (String file : files) { 
     if (new File(file).isDirectory()) { 
     continue; 
    } 
    FileInputStream in = new FileInputStream(file); 
    System.out.println(" Adding: " + file); 
     out.putNextEntry(new ZipEntry(file)); 
     int len; 
     while ((len = in.read(tmpBuf)) > 0) { 
     out.write(tmpBuf, 0, len); 
     } 
     out.closeEntry(); 
     in.close(); 
    } 
}