سؤال

أحصل على 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)

عند محاولة تشغيل قطعة التعليمات البرمجية التالية:

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

    }
}

يبدو لي أنه لسبب ما ، لا يمكن لـ JVM إنشاء ملف جديد. يعمل الرمز بشكل جيد تمامًا إذا كانت الملفات موجودة بالفعل. هل هناك نوع من ملفات الوصول التي تملي ما إذا كان JVM يمكنه إنشاء ملف جديد أم أنني ببساطة أفعل شيئًا خاطئًا؟

أي مساعدة هي محل تقدير كبير :-)

أقوم بتشغيل Java 1.4 وأختبر في JDeveloper في Windows XP.

هل كانت مفيدة؟

المحلول

القضية هي أن هذه المكالمات تتخطى بعضها البعض:

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

تفشل عملية الإنشاء لأنك قمت للتو بإنشاء دليل بنفس الاسم من الملف الذي تريد إنشاؤه.

ما تريد القيام به بدلاً من ذلك هو:

fileToWrite.getParentFile().mkdirs()

وأيضا ، الدعوة إلى createNewFile() غير ضروري.

بناء على الرمز الخاص بك. ما يلي "unzips" ملف zip:

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

إخلاء المسئولية: لم أختبرها وراء الأساسيات ذاتها.

نصائح أخرى

لماذا تتصل createNewFile()؟ فقط إنشاء fileOutputStream.

قد يكون ذلك أيضًا في السياق الذي تقوم فيه بتشغيل التطبيق الذي لا يمكنك الوصول إليه إلى المكان الذي تحاول إنشاء الملف. قم بتشغيل التطبيق كمسؤول أو إنشاء الملف في مجلد المشروع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top