2016-12-08 15 views
0

私はいくつかの画像が格納されたディレクトリを作成しました。私は、次のソースから、このコードを取得したAndroid Zipファイル

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(); 
    } 
    } 

:今、一つの.zipファイルとしてそれを圧縮するために、私は次のコードを使用http://www.java2s.com/Code/Java/File-Input-Output/Makingazipfileofdirectoryincludingitssubdirectoriesrecursively.htm

私はこのコードを実行し、指定したディレクトリに、 .zipファイルは指定された名前で作成されますが、AndroidやPC上のソフトウェア(winzipなど)を使用して開くと、このファイルが壊れているか、有効なzipファイルではないというエラーメッセージが表示されます。

助けていただければ幸いです。

+0

。これを試してみてください:新しいZipEntry(files [i] .substring(files [i] .lastIndexOf( "/")+ 1)); – Hahn

答えて

0

私は質問を削除することを考えていた。しかしそれはむしろ面白い読書の略です。 .zipファイルを作成する際に、私が圧縮したいディレクトリと同じディレクトリを指定しました。この結果、無限ループになります。 .zipディレクトリを変更すると、問題が解決されます。

+0

このコードは良い習慣ではありません。ターゲットzipファイルを除外するか、ファイルリストを最初に作成してからzip – reker

+0

申し訳ありません。私は理解できませんでした。どうぞあなたは詳しく教えていただけますか? –

0

私はこのような意味:私はZipEntryのファイル名ではなく、パスされるべきだと思う

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(); 
    } 
} 
関連する問題