2009-08-13 3 views
26

내 작은 유틸리티 응용 프로그램은 GUI 파일 선택기를 통해 사용자에게 출력 디렉토리를 요청합니다. 그런 다음 처리 후이 출력 디렉토리에 많은 파일을 작성합니다.내 파일을 만들기 전에 디렉토리에 쓰기 액세스 확인

나는 응용 프로그램은 사용자에게 알립니다 있도록 쓰기 액세스 권한을 가지고 있으며, 은 (시간이 오래 걸릴 수 있음) 처리를 계속하지 않을 경우 확인해야

내 첫 번째 시도였다 CanWrite라고() 메소드 java.io.File. 그러나 이것은 에서 작동하지 않으므로 디렉토리 항목 자체 만 다루고 내용은 다루지 않습니다. 적어도 이름이 바뀌거나 삭제할 수있는 Windows XP 폴더의 인스턴스 하나만 볼 수 있지만 사용 권한 때문에 파일을 만들 수 없습니다. 이것은 실제로 내 테스트 케이스입니다.

나는 마침내 그냥 작업이 성공하면 실제로 파일 및 검사를 만들려고하기 때문에이 나에게 우아한 느낌을하지 않는 다음과 같은 솔루션

//User places the input file in a directory and selects it from the GUI 
//All output files will be created in the directory that contains the input file 
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser 
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try 
{ 
    /* 
     * Create and delete a dummy file in order to check file permissions. Maybe 
     * there is a safer way for this check. 
     */ 
     sample.createNewFile(); 
     sample.delete(); 
} 
catch(IOException e) 
{ 
     //Error message shown to user. Operation is aborted 
} 

에 정착했다.

여기에 더 좋은 방법이 있어야한다고 생각하지만, 지금까지 발견 한 모든 해결책은 보안 관리자와 함께 Java 애플릿 및 독립형 응용 프로그램과 관련이 있습니다. 내가 빠진 것이 있습니까?

실제로 파일을 기록하기 전에 디렉토리 내의 파일 액세스를 확인하는 권장 방법은 무엇입니까? 내가

+0

"empty.txt"가 이미 존재한다면? 그런 다음 중요한 파일 일 수 있습니다. –

+0

예, createNewFile()에 의해 반환 된 부울을 사용하여 파일이 실제로 생성되지 않았는지 확인하는 것이 가장 좋습니다. – kazanaki

답변

19

당신은 파일 권한을 확인 할 수 있습니다 SecurityManager를 구현하는 디렉토리가 있는지 확인하고 확인을 많이 할 또는 모든 검사를 수행하는 라이브러리를 찾을 필요 하나 방법을 찾아 당신 하지만 (시도) 시도하는 가장 좋은 방법은 무엇입니까? 권한을 확인하고 파일 시스템이 변경되면 ... 코드를 변경해야합니다. 그러나 파일을 쓰려고하면 파일을 쓸 수 있는지 항상 알려줍니다.

귀하의 솔루션이 가장 우아한 솔루션 일 필요는 없습니다. 값싼 하드 코드 패치 나 추악한 것이 아닙니다. 그것은 단지 정상적인 코드입니다. 그리고 그것은 항상 효과가있을 것입니다. 그러나 코드에서 그 수표를보기 싫어한다면 클래스의 목표 만이 서면 가능성이 있는지 확인하는 것이 좋습니다. 사실, 당신은 우아함을 좋아하든 그렇지 않든간에 유틸리티 클래스에 넣어야합니다.

다른 해결책은 전체 드라이브 쓰기 코드를 시도해 보는 것입니다. 그리고 글을 쓸 수 없다면 전체 부분을 건너 뛰고 캐치 부분에 메시지로 사용자에게 피드백을 보냅니다.

0

당신이 최종 경로canWrite를 호출 작품을하지 않는 경우에도 자바 5를 사용하고

?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) { 
    doSomethingUseful(sample); 
} else { 
    notifyUser(); 
} 
+4

canWrite가 파일이 있는지 여부도 검사하기 때문에 그렇지 않습니다. 이것은 귀하의 코드와 관련이 없습니다. 이것은 javadoc에 언급되어 있습니다. – kazanaki

0

FilePermission을 사용하면 세부 정보를 얻을 수 있습니다. 난 당신이 코드는 herehere

+0

FilePermission을 살펴 봤지만 애플릿에서 파일에 대한 액세스 권한을 부여하는 데 사용됩니다. 독립 실행 형 응용 프로그램에 대한 예가 있습니까? – kazanaki

0

필자는 파일을 쓸 수없는 경우 좋은 사용자 환경을 제공하는 데 집중하고 경로 사전 검사를 신경 쓰지 않아도됩니다.프로세싱에는 링법이 적용된다고 했으므로 작업이 끝나면 그 경로에 쓸 수 있음을 보장 할 수있는 방법이 없습니다. 사용 권한을 확인하고 쓸 때 또는 디스크가 가득 찰 수있는 사이에 권한이 매우 잘 변경 될 수 있습니다 ...

0

Java 1.8을 사용하여 다음을 사용할 수있었습니다.

Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS); 
Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ)); 
Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE)); 
Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE)); 

Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ)); 
Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE)); 
Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE)); 

Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ)); 
Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE)); 
Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE)); 
관련 문제