Comment puis-je les fichiers zip en Java et ne pas inclure les chemins des fichiers

StackOverflow https://stackoverflow.com/questions/3018579

  •  26-09-2019
  •  | 
  •  

Question

Par exemple, je veux un fichier zip stocké dans /Users/me/Desktop/image.jpg

J'ai fait cette méthode:

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

Mais quand j'Extrayez le fichier, les fichiers décompressés ont le chemin complet.

Je ne veux pas le chemin complet de chaque fichier dans le zip que je veux que le nom du fichier.

Comment puis-je fait cela?

Était-ce utile?

La solution

Ici:

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

Vous créez l'entrée de ce fichier en utilisant le chemin entier. Si vous venez d'utiliser le nom (sans le chemin), vous aurez ce que vous avez besoin:

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

Autres conseils

Vous trouvez vos données source en utilisant le chemin relatif au fichier, puis définir l'entrée à la même chose. Au lieu de cela, vous devez tourner la source dans un objet fichier, puis utilisez

putNextEntry (nouveau ZipEntry (sourceFile.getName ()))

qui va vous donner la dernière partie du chemin (par exemple, le nom du fichier)

comme Jason dit , ou si vous voulez garder votre signature de la méthode, faire comme ceci:

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

ou, en utilisant FileNameUtils.getName de apache communes / io:

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

Vous pourriez probablement Evadez avec l'accès aux fichiers source via new FileInputStream (new File (sourcefilepath, sourceFileName)).

// easy way of zip a file 

java.io import *;.

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

Si vous zip deux fichiers du même nom, mais avec des chemins différents, vous courrez dans les erreurs de saisie de fichiers en double, cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top