2016-04-09 16 views
1

Bu yüzden bir zip dosyası oluşturdum ve "\" ile biten bir zip girişi oluşturarak zip dosyasında yeni bir alt klasör oluşturdum. Alt klasöre nasıl yazarım?Zip'de alt dizinlere yazmak ister misiniz? Java.util.zip'i kullanma. ZipEntry.putNextEntry()

Sorunum, bir for döngüsünde ZipOutputStream sayfamda bir putnextEntry çağrısı var, böylece klasör oluşturulduktan sonra farklı zip dosyalarının yazıldığı bir for döngüsüne atlayın. Ancak, zip içindeki alt dizinle aynı düzeyde yazılırlar.

Ne olduğunu düşünüyorum çünkü putNextEntry'yi ilk gerçek zip (dir) değil, alt klasörü kapatıp fermuarın köküne yazıyor. Herhangi bir fikir?

private int endprocess() { 
     try { 
      zipFolder(ripPath, zipOutputPath, "rips"); 
      //zipFolder(destPDFfiles, zipOutputPath, "pdfs"); 
      this.returnCode = 0; 
      //log.debug ("Accumulator count: " + acount); 
      log.debug("Equivest count: " + ecount); 
      //log.debug ("Assoc count: " + scount); 
      processEndOfEnvelope(); 
     } catch (Exception reportException) { 
      log.logError("Caught exception in creating."); 
      reportException.printStackTrace(); 
      this.returnCode = 15; 
     } 

     return (this.returnCode); 

    } 
    public static void zipFolder(String srcFolder, String dest, String outputFolder){ 
     try{ 
      ZipOutputStream zos = null; 
      FileOutputStream fos = null; 
      fos = new FileOutputStream(dest + "\\newzip.zip"); 
      zos = new ZipOutputStream(fos); 
      addFolderToZip(srcFolder, zos, outputFolder); 
      zos.flush(); 
      zos.close(); 
     }catch(IOException e){ 
      log.logError("**********************"); 
      log.logError("IO Exception occurred"); 
      log.logError(e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
    private static void addFileToZip(String srcFile, ZipOutputStream zos, String outputFolder){ 
     try { 
      File folder = new File(srcFile); 
      if (folder.isDirectory()) { 
       addFolderToZip(srcFile, zos, outputFolder); 
      } else { 
       byte[] buffer = new byte[1024]; 
       int length; 
       FileInputStream fis = new FileInputStream(srcFile); 
       ZipEntry ze = new ZipEntry("C:\\AWDAAV\\zip\\newzip.zip\\" + outputFolder + "\\" + folder.getName()); 
       zos.putNextEntry(ze); 
       while ((length = fis.read(buffer)) > 0) { 
        zos.write(buffer, 0, length); 
       } 
      } 
     }catch(Exception e){ 
      log.logError("**********************"); 
      log.logError("Exception occurred"); 
      log.logError(e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    private static void addFolderToZip(String srcFolder, ZipOutputStream zos, String outputFolder){ 
     try{ 
      File folder = new File(srcFolder); 
      zos.putNextEntry(new ZipEntry(outputFolder + "\\")); 
      for(String fileName : folder.list()){ 
       addFileToZip(srcFolder + "\\" + fileName, zos, outputFolder); 
      } 
     }catch(Exception e){ 
      log.logError("**********************"); 
      log.logError("Exception occurred"); 
      log.logError(e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
+0

Eklendi kodu. – hfrog713

cevap

1

Kodunuza bir baktım ve sanırım ZIP API'sı düşündüğünüz gibi çalışıyor.

Yalnızca yol adlarıyla bazı mantık hataları yaptınız. Yol adlarını yerel adlardan zip dosyasındaki göreli konumlara dönüştürmeniz gerekir. Belki bu bölgede bir yerlerde kafanız karıştı.

Dosya: Burada

benim öneri org/example/Main.java

package org.example; 

import java.io.IOException; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     MyZip myZip = new MyZip(); 
     Path sourcePath = Paths.get("C:/Users/David/Desktop/a"); 
     Path targetPath = Paths.get("C:/Users/David/Desktop/zip/out.zip"); 
     Path zipPath = Paths.get("tadaa"); 
     myZip.zipFolder(sourcePath, targetPath.toFile(), zipPath); 
    } 

} 

Güncelleme: Ana yöntemle

  • sourcePath değişkenlerin açıklanması bir dizindir zip arşivine dahil etmek istediğiniz içerik.
  • targetPath, zip dosyasının çıktı yoludur. Örneğin, yeni zip dosyası tam olarak bu konumda oluşturulacaktır.
  • zipPath, sourcePath içeriğinizin yerleştirileceği zip dizinindeki alt dizindir. Bu değişken ayrıca null olarak da ayarlanabilir. null ise, sourcePath yeni zip arşivinin köküne konacaktır.

Dosya: org/example/MyZip.java

package org.example; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

public class MyZip { 

    public void zipFolder(Path base, File dest, Path zipFolder) throws IOException { 
     try (FileOutputStream fos = new FileOutputStream(dest); 
       ZipOutputStream zos = new ZipOutputStream(fos)) { 
      addFolderToZip(base.getParent(), base, zos, zipFolder); 
     } 
    } 

    private void addFolderToZip(Path base, Path currentFolder, ZipOutputStream zos, Path zipFolder) throws IOException { 
     try (DirectoryStream<Path> stream = Files.newDirectoryStream(currentFolder)) { 
      for(Path path : stream) { 
       Path relativePath = base != null ? base.relativize(path) : path; 
       Path pathInZip = zipFolder != null ? zipFolder.resolve(relativePath) : relativePath; 
       if(path.toFile().isDirectory()) { 
        zos.putNextEntry(new ZipEntry(pathInZip.toString() + "/")); 
        // recurse to sub directories 
        addFolderToZip(base, path, zos, zipFolder); 
       } else { 
        addFileToZip(path, pathInZip, zos); 
       } 
      } 
     } 
    } 

    private void addFileToZip(Path sourcePath, Path pathInZip, ZipOutputStream zos) throws IOException { 
     byte[] buffer = new byte[1024]; 
     int length; 
     try (FileInputStream fis = new FileInputStream(sourcePath.toFile())) { 
      ZipEntry ze = new ZipEntry(pathInZip.toString()); 
      zos.putNextEntry(ze); 
      while ((length = fis.read(buffer)) > 0) { 
       zos.write(buffer, 0, length); 
      } 
     } 
    } 

} 
+0

zipPath değişkeninin tuttuğu hakkında biraz kafam karıştı. Zip dosyası gerçekten ne zaman oluşturulur?TargetPath, zip içindeki alt dizine işaret eder mi? – hfrog713

+0

Ana yöntemdeki tüm değişkenlerin cevabım için bir açıklama ekledim. Ayrıca kodu sadece bir java projesine kopyalayıp yapıştırabilir ve ne yaptığını görmek için çalıştırabilirsiniz. Tabii ki ana yöntemde kodlanmış yolları değiştirmelisiniz. – David

+0

Tamam, mükemmel bir çözüm. Yardımın için minnettarım. Statik bir yöntemle statik bir sınıf yaptım, böylece MyZip'i daha çok bir yardımcı sınıf gibi göstermek zorunda kalmam. Sahip olduğum tek sorun şu ki, bunu bir kez daha çalıştırdığımda, fermuarımın üzerine yazıyor. Bu yüzden Zip'de sadece 1 alt anahtar oluşturabilirim. FileOutputStream'imi başlatmamla ilgili bir şey olduğuna inanıyorum. Bir bakacağım ve anladığımı anlatayım. – hfrog713

0

ZipEntry.setLevel altında

Kodu (filepath [senin durumunda, \ klasör]);

+0

ZipEntry sınıfında setLevel yöntemi yok. Bu gerçekten işe yaradıysa ne aradığımı gösteriyor. – hfrog713

+0

ZipEntry'de değil, ZipOutputStream'de var, sanırım, akış başlatması sırasında yolu ayarlarsanız, – Rocket6488

+0

seviyesindeki herhangi bir bilgiyi, ZipOutputStream sınıfındaki .level metodu sıkıştırma seviyesini ayarlamaktır. Bir FileOutputStream yolunu ayarladım ama sorun, sadece bir kez FileOutputStream oluşturmak için bir kez .zip dosyası oluşturmaktır. Oradan .zip dizinindeki bir klasöre yazıyorum. – hfrog713

İlgili konular