Frage

Ich erhalte die folgende IOException:

java.io.IOException: Access is denied
 at java.io.WinNTFileSystem.createFileExclusively(Native Method)
 at java.io.File.createNewFile(File.java:850)
 at zipUnzipper.main(zipUnzipper.java:41)

Beim Versuch, den folgenden Code auszuführen:

public class zipUnzipper {
    public zipUnzipper() {
    }

    public static void main(String[] args){

        //Unzip to temp folder. Add all files to mFiles. Print names of all files in mFfiles.
        File file = new File("C:\\aZipFile.zip");
        String  filename = file.getName();
        String filePathName = new String();

        int o = filename.lastIndexOf('.');
            filename = filename.substring(0,o);

        try {      
                ZipFile zipFile = new ZipFile (file.getAbsoluteFile());
                Enumeration entries = zipFile.entries();
                while(entries.hasMoreElements()) {
                    ZipEntry zipEntry = (ZipEntry) entries.nextElement();
                    System.out.println("Unzipping: " + zipEntry.getName());
                    BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
                    byte[] buffer = new byte[2048];
                    filePathName = "C:\\TEMP\\"+filename+"\\";
                    File fileToWrite = new File(filePathName+ zipEntry.getName());
                    fileToWrite.mkdirs();
                    fileToWrite.createNewFile();
                    FileOutputStream fos = new FileOutputStream(fileToWrite);
                    BufferedOutputStream bos = new BufferedOutputStream( fos , buffer.length );
                    int size;
                    while ((size = bis.read(buffer, 0, buffer.length)) != -1) {
                        bos.write(buffer, 0, size);
                    }
                    bos.flush();
                    bos.close();
                    bis.close();
                }
                zipFile.close();
                File folder = new File (filePathName);
                File [] mFiles = folder.listFiles();

                for (int x=0; x<mFiles.length; x++) {
                                System.out.println(mFiles[x].getAbsolutePath());
                        }
        } catch (ZipException ze) {
            ze.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

    }
}

Es scheint mir aus irgendeinem Grund, dass die JVM kann keine neue Datei erstellen. Der Code läuft sehr gut, wenn die Dateien bereits vorhanden sind. Gibt es irgendeine Art von Access-Datei, die bestimmt, ob die JVM eine neue Datei erstellen können oder bin ich einfach etwas falsch zu machen?

Jede Hilfe ist sehr geschätzt: -)

Ich bin mit Java 1.4 und habe in JDeveloper in Windows XP Testen wurde.

War es hilfreich?

Lösung

Das Problem ist, dass diese Anrufe aufeinander Schritt:

  fileToWrite.mkdirs(); //creates a directory e.g. C:\temp\foo\x
  fileToWrite.createNewFile(); //attempts to create a file C:\temp\foo\x

Der create-Vorgang fehlschlägt, weil Sie nur ein Verzeichnis mit dem gleichen Namen wie die Datei, die Sie erstellen möchten, erstellt.

Was Sie wollen, anstatt zu tun ist:

fileToWrite.getParentFile().mkdirs()

Und auch der Aufruf von createNewFile() ist nicht erforderlich.

auf dem Code-Basis. Die folgende "unzips" eine ZIP-Datei:

import java.io.*;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.util.Enumeration;

public class Unzipper {
    public static void main(String[] args)
            throws IOException {
        final File file = new File(args[0]);
        final ZipFile zipFile = new ZipFile(file);
        final byte[] buffer = new byte[2048];
        final File tmpDir = new File(System.getProperty("java.io.tmpdir"), zipFile.getName());

        if(!tmpDir.mkdir() && tmpDir.exists()) {
            System.err.println("Cannot create: " + tmpDir);
            System.exit(0);
        }

        for(final Enumeration entries = zipFile.entries(); entries.hasMoreElements();) {
            final ZipEntry zipEntry = (ZipEntry) entries.nextElement();
            System.out.println("Unzipping: " + zipEntry.getName());

            final InputStream is = zipFile.getInputStream(zipEntry);
            final File fileToWrite = new File(tmpDir, zipEntry.getName());
            final File folder = fileToWrite.getParentFile();
            if(!folder.mkdirs() && !folder.exists()) {
                System.err.println("Cannot create: " + folder);
                System.exit(0);
            }

            if(!zipEntry.isDirectory()) {
                //No need to use buffered streams since we're doing our own buffering
                final FileOutputStream fos = new FileOutputStream(fileToWrite);
                int size;
                while ((size = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, size);
                }
                fos.close();
                is.close();
            }
        }
        zipFile.close();
    }
}

Disclaimer:. Ich habe es nicht über die Grundlagen getestet

Andere Tipps

Warum rufst du createNewFile()? Erstellen Sie einfach die Outputstream.

Es könnte auch, dass in Zusammenhang sein, wenn Sie die Anwendung starten Sie die Rechte nicht an den Ort Zugriff haben, in dem Sie die Datei erstellen möchten. Starten Sie die App als Administrator oder die Datei im Projektordner erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top