2014-12-25 12 views
8

사용자가 .dmg와 같은 읽기 전용 파일 시스템에서 Java 기반 응용 프로그램을 시작했는지 여부를 알고 싶습니다. 업데이트는 오류로 중단하는 대신 의미있는 정보를 표시 할 수 있습니다. 처음에는 .app의 경로를 검사하는 것으로 충분하다고 생각했는데 (.dmg에서 시작한 경우 /Volumes/MyApp 1.2.3/MyApp.app과 비슷하지만 사용자가 다른 파티션에 응용 프로그램을 설치했을 수 있기 때문에 작동하지 않습니다.) ?OS X의 읽기 전용 파일 시스템에서 응용 프로그램이 시작되었는지 감지

+0

정확하게의 당신의 정의 무엇입니까 읽기 전용입니까? 파일 시스템에 쓰기가 가능하지만 사용자가 앱 번들을 수정할 수있는 권한이 없다면 어떻게 될까요? 자격이 되나요? – NPE

+0

아니요, 응용 프로그램이 권한을 요청할 수 있기 때문입니다. –

답변

1

:

File classpathRoot = new File(MyClass.class.getClassLoader().getResource("").getPath()); 
/* getPath() actually returns a String instead of a Path object, 
    * so we need to take this little detour */ 
Path yourAppPath = classpathRoot.toPath(); 
boolean isReadOnly = Files.getFileStore(yourAppPath).isReadOnly(); 
3

OSX 준수 POSIX 인 경우, 파일 시스템이 R/O를 장착하는 경우, 당신은 statvfs() 또는 fstatvfs()ST_RDONLY 비트가 R/O 파일 시스템에 대해 설정해야 struct statvfs 필드 f_flag을 반환 사용할 수 있습니다 결정.

그것이로 의견을 지적한 경우이 정보가 OS에서 올바르게 제공되는지 확인하십시오.

JNAthis 질문은 Java에 유용 할 수 있습니다.

몇 가지 아이디어가 유용 할 수 있습니다. here (access(), open(),).

OS X 특정 statfs()도 사용할 수 있지만이 기능은 이식 할 수 없습니다 (Linux 및 * BSD는 약간 다른 기능을 가지고 있습니다).

+0

실제로 POSIX와 호환되는 것은 ** 파일 시스템이 읽기 전용인지를 확인하기 위해'statvfs()'를 사용할 수 없다는 것을 의미하지 않습니다. [man page] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/statvfs.3.html)는 POSIX가 실제로 이러한 기능을 필요로하지 않는다고 말합니다. * 휴대용 앱에서 사용해서는 안됩니다. 이 질문이 OS X에만 한정되어 있다고 가정하면이 경우이 질문을 사용할 수 있지만 POSIX 호환 OS에서 사용할 수 있다는 의미는 정확하지 않습니다. –

+0

@KenThomases, http://pubs.opengroup.org/onlinepubs/9699919799/functions/statvfs.html에서는 "Issue 7"부터 ** XSI **에서 ** Base **로 이동 했으므로 POSIX 컨 포멀 시스템에서는 더 이상 선택 사항이 아니라는 것을 이해해야합니다. – kestasx

+0

링크에서 "statvfs 구조의 모든 구성원이 모든 파일 시스템에서 의미있는 값을 가지는지 여부는 지정되지 않았습니다". 이 함수는 기본 표준의 일부이지만 아무 것도 할 필요가 없습니다 **. –

5

-[NSURL getResourceValue:forKey:error:]NSURLVolumeIsReadOnlyKey을 사용할 수 있습니다. [[NSBundle mainBundle] bundleURL]에 의해 반환 된 앱 번들 URL에이를 적용합니다. 그래서 :

당신은 또한 당신의 경로와 연관된 FileStore를 조회하여 읽기 전용 디렉토리에있는 무언가에 특정 경로 지점 여부를 자바에서 직접 확인할 수 있습니다
NSBundle* bundle = [NSBundle mainBundle]; 
NSURL* bundleURL = bundle.bundleURL; 
NSNumber* readOnly; 
NSError* error; 
if ([bundleURL getResourceValue:&readOnly forKey:NSURLVolumeIsReadOnlyKey error:&error]) 
{ 
    BOOL isReadOnly = [readOnly boolValue]; 
    // act on isReadOnly value 
} 
else 
{ 
    // Handle error 
} 
+0

SWT를 사용하여 Java에서 복제하기가 쉬우므로 별도의 메소드 호출로 분할 할 수 있습니까? 미리 감사드립니다. –

+0

답변을 수정했습니다. 그게 당신이 의미 한 것입니까? –