2010-06-10 10 views
18

Zum Beispiel ist, möchte ich eine Datei in /Users/me/Desktop/image.jpg gespeichert zipWie kann ich Dateien in Java zip und keine Dateien Pfade

ich diese Methode gemacht:

public static Boolean generateZipFile(ArrayList<String> sourcesFilenames, String destinationDir, String zipFilename){ 
    // Create a buffer for reading the files 
    byte[] buf = new byte[1024]; 

    try { 
    // VER SI HAY QUE CREAR EL ROOT PATH 
     boolean result = (new File(destinationDir)).mkdirs(); 

     String zipFullFilename = destinationDir + "/" + zipFilename ; 

     System.out.println(result); 

    // Create the ZIP file 
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFullFilename)); 
    // Compress the files 
    for (String filename: sourcesFilenames) { 
    FileInputStream in = new FileInputStream(filename); 
    // Add ZIP entry to output stream. 
    out.putNextEntry(new ZipEntry(filename)); 
    // Transfer bytes from the file to the ZIP file 
    int len; 
    while ((len = in.read(buf)) > 0) { 
    out.write(buf, 0, len); 
    } 
    // Complete the entry 
    out.closeEntry(); 
    in.close(); 
    } // Complete the ZIP file 
    out.close(); 

    return true; 
    } catch (IOException e) { 
    return false; 
    } 
} 

Aber wenn ich die Datei extrahiere, haben die entpackten Dateien den vollständigen Pfad.

Ich möchte nicht den vollständigen Pfad jeder Datei in der Zip ich möchte nur den Dateinamen.

Wie kann ich das machen?

Antwort

31

hier:

// Add ZIP entry to output stream. 
out.putNextEntry(new ZipEntry(filename)); 

Sie für diese Datei den Eintrag Erstellen des gesamten Pfad. Wenn Sie nur den Namen verwenden (ohne den Pfad) Sie haben, was Sie brauchen:

// Add ZIP entry to output stream. 
File file = new File(filename); //"Users/you/image.jpg" 
out.putNextEntry(new ZipEntry(file.getName())); //"image.jpg" 
2

Sie finden Ihre Quelldaten mit dem relativen Pfad zur Datei und setzen den Eintrag dann auf dasselbe. Stattdessen sollten Sie die Quelle in einem File-Objekt drehen, und verwenden Sie dann

putNextEntry (neu ZipEntry (sourceFile.getName()))

, die Sie gerade den letzten Teil des Weges geben werde (dh die tatsächliche Dateiname)

+0

danke !!!! es funktioniert super – Ignacio

1

as Jason said tun, oder wenn Sie Ihre Methodensignatur behalten wollen, tun Sie es wie folgt aus:

out.putNextEntry(new ZipEntry(new File(filename).getName())); 

oder mit FileNameUtils.getName von apache commons/io:

out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename))); 
0

Sie könnten wahrscheinlich get away mit Quelldateien über neue FileInputStream zugreifen (neue Datei (sourceFilePath, sourceFileName)).

0
// easy way of zip a file 

import java.io. *; obwohl

import java.util.zip.*; 

public class ZipCreateExample{ 

    public static void main(String[] args) throws Exception { 
      // input file 
     FileInputStream in = new FileInputStream("F:/ZipCreateExample.txt");; 
     // out put file 
     ZipOutputStream out =new ZipOutputStream(new FileOutputStrea("F:/tmp.zip")); 
     // name of file in zip folder 
     out.putNextEntry(new ZipEntry("zippedfile.txt")); 

     byte[] b = new byte[1024]; 

     int count; 

     // writing files to new zippedtxt file 
     while ((count = in.read(b)) > 0) { 
      System.out.println(); 

     out.write(b, 0, count); 
     } 
     out.close(); 
     in.close(); 
    } 
} 
0
try { 
    String zipFile = "/locations/data.zip"; 
    String srcFolder = "/locations"; 

    File folder = new File(srcFolder); 
    String[] sourceFiles = folder.list(); 

    //create byte buffer 
    byte[] buffer = new byte[1024]; 

    /* 
    * To create a zip file, use 
    * 
    * ZipOutputStream(OutputStream out) constructor of ZipOutputStream 
    * class. 
    */ 
    //create object of FileOutputStream 
    FileOutputStream fout = new FileOutputStream(zipFile); 

    //create object of ZipOutputStream from FileOutputStream 
    ZipOutputStream zout = new ZipOutputStream(fout); 

    for (int i = 0; i < sourceFiles.length; i++) { 
     if (sourceFiles[i].equalsIgnoreCase("file.jpg") || sourceFiles[i].equalsIgnoreCase("file1.jpg")) { 
      sourceFiles[i] = srcFolder + fs + sourceFiles[i]; 
      System.out.println("Adding " + sourceFiles[i]); 
      //create object of FileInputStream for source file 
      FileInputStream fin = new FileInputStream(sourceFiles[i]); 

      /* 
      * To begin writing ZipEntry in the zip file, use 
      * 
      * void putNextEntry(ZipEntry entry) method of 
      * ZipOutputStream class. 
      * 
      * This method begins writing a new Zip entry to the zip 
      * file and positions the stream to the start of the entry 
      * data. 
      */ 

      zout.putNextEntry(new ZipEntry(sourceFiles[i].substring(sourceFiles[i].lastIndexOf("/") + 1))); 

      /* 
      * After creating entry in the zip file, actually write the 
      * file. 
      */ 
      int length; 

      while ((length = fin.read(buffer)) > 0) { 
       zout.write(buffer, 0, length); 
      } 

      /* 
      * After writing the file to ZipOutputStream, use 
      * 
      * void closeEntry() method of ZipOutputStream class to 
      * close the current entry and position the stream to write 
      * the next entry. 
      */ 

      zout.closeEntry(); 

      //close the InputStream 
      fin.close(); 

     } 
    } 

    //close the ZipOutputStream 
    zout.close(); 

    System.out.println("Zip file has been created!"); 

} catch (IOException ioe) { 
    System.out.println("IOException :" + ioe); 
} 
0

Wenn Sie zwei Dateien mit dem gleichen Namen zip aber mit unterschiedlichen Pfaden finden Sie in doppelte Dateieingabefehler führen.