2016-05-19 7 views
0

Ich versuche, eine ZIP-Datei nach dem Unzipieren zu löschen. aber ich bin nicht in der Lage, es zu löschen:Zip-Datei nicht gelöscht, auch wenn ich seinen korrekten Namen und Pfad

if (file.getName().contains(".zip")) { 
    System.out.println(file.getAbsolutePath()); // I am getting the correct path 
    file.delete(); 
    System.out.println(file.getName()); // I am getting the correct name Script-1.zip 
} 

Dies ist der vollständige Code

public class Zip4 { 

    public static void main(String[] args) { 
     File[] files = new File(args[0]).listFiles(); 

     for(File file : files) 
     // System.out.println(file.getName()); 
      //if(file.getName().contains("1400") && file.getName().contains(".zip")) 
       extractFolder(args[0] + file.getName(), args[1]); 
     DeleteFiles(); 

    // for(File file : files) 
       // System.out.println("File:C:/1/"+ file.getName()); 

//  extractFolder(args[0]+file.getName(),args[1]); 

    } 

    private static void DeleteFiles() 
    { 
     File f = null; 
     File[] paths; 
     f = new File("D:/Copyof"); 
     paths = f.listFiles(); 

      for(File path:paths) 
      { 
       // prints file and directory paths 
       if(path.getName().contains("J14_0_0RC") || path.getName().contains(".zip") || path.getName().contains(".log")) 
       { 

        //System.out.println(path); 
        path.delete(); 
       } 

      } 
    } 

    private static void extractFolder(String zipFile,String extractFolder) 
    { 
     try 
     { 
      int BUFFER = 2048; 
      File file = new File(zipFile); 
      ZipFile zip = new ZipFile(file); 
      String newPath = extractFolder; 

      new File(newPath).mkdir(); 
      Enumeration zipFileEntries = zip.entries(); 

      // Process each entry 
      while (zipFileEntries.hasMoreElements()) 
      { 
       // grab a zip file entry 
       ZipEntry entry = (ZipEntry) zipFileEntries.nextElement(); 
       String currentEntry = entry.getName(); 

       File destFile = new File(newPath, currentEntry); 
       //destFile = new File(newPath, destFile.getName()); 
       File destinationParent = destFile.getParentFile(); 

       // create the parent directory structure if needed 
       destinationParent.mkdirs(); 

       if (!entry.isDirectory()) 
       { 
        BufferedInputStream is = new BufferedInputStream(zip 
        .getInputStream(entry)); 
        int currentByte; 
        // establish buffer for writing file 
        byte data[] = new byte[BUFFER]; 

        // write the current file to disk 
        FileOutputStream fos = new FileOutputStream(destFile); 
        BufferedOutputStream dest = new BufferedOutputStream(fos, 
        BUFFER); 

        // read and write until last byte is encountered 
        while ((currentByte = is.read(data, 0, BUFFER)) != -1) { 
         dest.write(data, 0, currentByte); 
        } 
        dest.flush(); 
        dest.close(); 
        fos.flush(); 
        fos.close(); 
        is.close(); 
       } 

      } 

      if(file.getName().contains(".zip")) 
      { 
       System.out.println(file.getAbsolutePath()); 
       file.delete(); 
        System.out.println(file.getName()); 
      } 
     } 
     catch (Exception e) 
     { 
      System.out.println("Error: " + e.getMessage()); 

     } 
    } 
} 
+0

Vielleicht endet die Datei mit '.ZIP'. Dann würde '' enthält (". Zip")) 'nicht wie erwartet funktionieren. – SubOptimal

+0

** Schließen Sie alle Ressourcen, die Sie geöffnet haben, schließlich blck ** – emotionlessbananas

Antwort

2

ZipFile ist eine verschließbare Ressource. Also entweder close() es einmal Sie in einem getan schließlich blockieren oder erstellen mit try-with-resources (seit Java7):

try(ZipFile zip = new ZipFile(file)){ 
    //unzip here 
} 
file.delete(); 

Abgesehen davon, sollten Sie diesen Block erneut

dest.flush(); 
dest.close(); 
fos.flush(); 
fos.close(); 
is.close(); 

die ziemlich anfällig ist Ressourcenlecks. Wenn einer der oberen Aufrufe fehlschlägt, werden alle nachfolgenden Aufrufe nicht aufgerufen, was zu nicht abgeschlossenen Ressourcen und Ressourcenverlusten führt.

Am besten wäre es, auch hier try-with-resources zu verwenden.

try(BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry)); 
    FileOutputStream fos = new FileOutputStream(destFile); 
    BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) { 
    //write the data 
} //all streams are closed implicitly here 

oder ein vorhandenes Werkzeug dafür verwenden, zum Beispiel Apache Commons IOIOUtil.closeQuietly(resource) oder embedd jeden einzelnen Anruf in

if(resource != null) { 
    try{ 
    resource.close(); 
    } catch(IOException e){ 
    //omit 
    } 
} 

Sie könnten auch den Aufruf von flush() lassen, was implizit erfolgt, wenn die Ressource zu schließen.

+0

Ich bin nicht so gut in Java, ich habe versucht, 'Zipfile.close();' Aber ich hatte 'Kann nicht einen statischen Verweis auf die nicht-statische Methode zu schließen() vom Typ ZipFile "Ich wusste nicht, wie ich das lösen soll. Wie wäre es in Ihrem Code, wenn ich den Test hinzufügen würde? – Moudiz

+0

rufen Sie es auf 'zip' ... die Instanz von' ZipFile' auf, die Sie erstellt haben -> 'zip.close()', aber verwenden Sie besser try-with-resources, wenn Sie auf java> = 7 sind. Ich muss mir darüber Gedanken machen –