2016-08-24 2 views
1

Ich versuche, Dateien mit JAVA zu entpacken und es kompiliert ohne Fehler. Wenn ich es von meinem Werkzeug nenne, und absoluten Zielpfad und Quellpfad der Datei zB geben: Quelle: D: \ data \ test.zip Destination: D: \ data \ op \Zip-Datei mit JAVA-ZipFile-Klasse entpacken

ich immer bin Fehler wie Acess verweigern

Stack-Trace (I Admin Zugang von System):

Extrahierung: Test/neuen Textdokument - Kopie (2) .txt java.io.FileNotFoundException: D: \ Data \ Op (Zugriff verweigert) unter java.io.FileOutputStream.open (Native Method) unter java.io.FileOutputStream. (FileOutputStream.java:179) bei java.io.FileOutputStream. (FileOutputStream.java:70)

Unten ist die Funktion, die ich nennen werde, ich glaube, es zu tun hat mit Ziel, da es möglicherweise nicht zum absoluten Pfad extrahiert wird, sondern ein temporärer Ordner, in den es nicht schreiben kann. Ich habe versucht, eine Kombination auf dem Ziel, aber nicht funktioniert von meinem Ende. Bitte führen Sie mich, wie wir es beheben können.

public void unzip(String zipFilePath, String destDir, String flName) throws Exception 
    { 
    int BUFFER = 2048;//Buffer Size 
try 
    { 
     File dir = new File(destDir); 
     // Throw Exception if output directory doesn't exist 

     if(!dir.exists()) 
     { 
      //Print Message in Consol 
     System.out.println("No Destination Directory Exists for Unzip Operation."); 
     throw new Exception(); 
       } 
     BufferedOutputStream dest = null; 
     BufferedInputStream is = null; 
     ZipEntry entry; 
     ZipFile zipfile = new ZipFile(zipFilePath); 
     Enumeration e = zipfile.entries(); 
     while(e.hasMoreElements()) 
     { 
      entry = (ZipEntry) e.nextElement(); 
      System.out.println("Extracting: " +entry); 
      is = new BufferedInputStream (zipfile.getInputStream(entry)); 
      int count; 
      byte data[] = new byte[BUFFER]; 
      FileOutputStream fos = new FileOutputStream(destDir); 
      dest = new BufferedOutputStream(fos, BUFFER); 

      while ((count = is.read(data, 0, BUFFER)) != -1) 
       { 
       dest.write(data, 0, count); 
       } 
       //Close All Streams 
      dest.flush(); 
      dest.close(); 
      is.close(); 
      } 
     } 
     catch(Exception e) 
      { 
     e.printStackTrace(); 
     throw new Exception(); 
      } 

    } 
+0

Führen Sie die App über die Befehlszeile? Dann starte 'cmd' als admininitrator – Jens

+0

Ich rufe es von einem Tool, das mit admin pretrilages läuft :) – SOAMad

Antwort

1

Sie versuchen, in das Verzeichnis zu ändern

FileOutputStream fos = new FileOutputStream(destDir);

versucht es

FileOutputStream fos = new FileOutputStream(destDir + File.separator + entry.getName());

mit dem Namen s‘ZipFile entry zu

schreiben

+0

Ich habe gerade versucht FileOutputStream fos = new FileOutputStream (destDir + File.separator + flName); Da der Dateiname in flName peramater übergeben wird, habe ich überraschenderweise eine ZIP-Datei anstelle einer entpackten Datei erhalten. – SOAMad

+0

Ich versuche nur, alle Dateien aus der Zip-Datei in das Zielverzeichnis zu schreiben. – SOAMad

+0

Meine Antwort für Sie aktualisiert –

1

einem einfachen unzippingexample von Oracle:

import java.io.*; 
import java.util.zip.*; 

public class UnZip { 
    final int BUFFER = 2048; 
    public static void main (String argv[]) { 
     try { 
     BufferedOutputStream dest = null; 
     FileInputStream fis = new 
     FileInputStream(argv[0]); 
     ZipInputStream zis = new 
     ZipInputStream(new BufferedInputStream(fis)); 
     ZipEntry entry; 
     while((entry = zis.getNextEntry()) != null) { 
      System.out.println("Extracting: " +entry); 
      int count; 
      byte data[] = new byte[BUFFER]; 
      // write the files to the disk 
      FileOutputStream fos = new 
      FileOutputStream(entry.getName()); 
      dest = new 
       BufferedOutputStream(fos, BUFFER); 
      while ((count = zis.read(data, 0, BUFFER)) 
       != -1) { 
       dest.write(data, 0, count); 
      } 
      dest.flush(); 
      dest.close(); 
     } 
     zis.close(); 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 
3

Der Inhalt einer ZIP-Datei können beide Verzeichnisse und Dateien sein. Wenn die Datei extrahiert wird, kann sie beim Extrahieren direkt extrahiert werden, indem BufferedOutputStream .write() verwendet wird. Wenn ZipEntry jedoch ein Verzeichnis ist, können Sie das nicht tun, da kein Verzeichnis vorhanden ist. Daher müssen Sie ein neues Verzeichnis mit dem Pfad erstellen.

Der obige Code berücksichtigt das Verzeichnis nicht, daher werden die Dateien, die in das neue Verzeichnis geschrieben werden müssen, die in der Frage erwähnte Ausnahme auslösen.

Die folgende Methode behebt Ihr Problem.

public void unzip(String zipFilePath, String destDirectory) throws IOException { 
    File destDir = new File(destDirectory); 
    if (!destDir.exists()) { 
     destDir.mkdir(); 
    } 
    ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); 
    ZipEntry entry = zipIn.getNextEntry(); 
    // iterates over entries in the zip file 
    while (entry != null) { 
     String filePath = destDirectory + File.separator + entry.getName(); 
     if (!entry.isDirectory()) { 
      // if the entry is a file, extracts it 
      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); 
      byte[] bytesIn = new byte[BUFFER_SIZE]; 
      int read = 0; 
      while ((read = zipIn.read(bytesIn)) != -1) { 
       bos.write(bytesIn, 0, read); 
      } 
      bos.close(); 
     } else { 
      // if the entry is a directory, make the directory 
      File dir = new File(filePath); 
      dir.mkdir(); 
     } 
     zipIn.closeEntry(); 
     entry = zipIn.getNextEntry(); 
    } 
    zipIn.close(); 
} 
+0

Ich werde den Code versuchen, bevor es als Antwort. – SOAMad