2009-10-21 8 views
4

나는 다음과 같은 IOException가 얻을 사용 거부 :IOException이 액세스 FileOutputStream에

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이 새로운 파일을 생성 할 수 있는지 또는 단순히 뭔가 잘못하고 있는지를 지시하는 액세스 파일이 있습니까?

어떤 도움

훨씬

내가 자바 1.4을 실행하는거야 및 Windows XP에서 JDeveloper의에서 테스트 한 :-) 감사합니다.

+1

Windows 계정에 해당 디렉터리에 파일을 만들 수있는 권한이 있습니까? –

+0

http://stackoverflow.com/a/23697734/715269 – Gangnus

답변

11

문제는이 통화가 서로에 단계이다 : 당신은 당신이 만들려는 파일보다 같은 이름의 디렉토리를 생성하기 때문에

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()에 대한 호출이 필요하지 않습니다.

코드를 기반으로합니다. 다음은 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(); 
    } 
} 

면책 조항 : 기본 사항 이상으로 테스트하지 않았습니다.

2

createNewFile()으로 전화 하시겠습니까? FileOutputStream을 생성하면됩니다.

0

응용 프로그램을 시작한 컨텍스트에서 파일을 만들려는 위치에 대한 권한이없는 경우도있을 수 있습니다. 앱을 관리자 권한으로 실행하거나 프로젝트 폴더에 파일을 만듭니다.