2014-12-25 2 views
8

Я хочу знать, запускает ли пользователь наше Java-приложение из файловой системы только для чтения, например, из .dmg, поэтому функции, обновление сможет отображать значимую информацию, а не прерывать с ошибкой. Сначала я думал, что проверка пути .app будет достаточной (при запуске из .dmg это что-то вроде /Volumes/MyApp 1.2.3/MyApp.app, но это не сработает, потому что пользователь мог установить приложение на другой раздел. Что еще я могу проверить ?Обнаружение того, было ли приложение запущено из файловой системы только для чтения в OS X

+0

Что именно ваше определение только для чтения? Что делать, если файловая система доступна для записи, но у пользователя отсутствуют разрешения на изменение пакета приложений? Будет ли это соответствовать? – NPE

+0

Нет, поскольку приложение может запрашивать разрешения. –

ответ

1

Вы также можете проверить непосредственно из Java ли определенных точек пути к чему-то внутри директории только для чтения, запрашивая FileStore, связанный с пути:

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(), вернулся struct statvfs поле f_flag должен иметь ST_RDONLY бит, установленный для R/O файловой системы.

Как это было указав в комментариях, проверьте, правильно ли предоставлена ​​эта информация ОС.

JNA и this вопрос может быть полезен для Java.

Еще несколько идей, которые могут быть полезны here (access(), open(), utime()).

OS X специфический statfs() также может использоваться, но эта функция не переносима (Linux и * BSD имеют несколько иные функции statfs()).

+0

На самом деле, будучи совместимым с POSIX, ** не ** означает, что можно использовать 'statvfs()', чтобы узнать, доступна ли файловая система только для чтения. В [man page] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/statvfs.3.html) говорится, что POSIX фактически не требует выполнения этих функций * ничего * и что они не должны использоваться портативными приложениями. Учитывая, что вопрос был специфичен для OS X, их можно было использовать в этом случае, но ваш вывод о том, что их можно использовать в любой ОС, совместимой с POSIX, неверен. –

+0

@KenThomases, http://pubs.opengroup.org/onlinepubs/9699919799/functions/statvfs.html говорит, что из «Проблема 7» эти функции перемещаются в ** Base ** из ** XSI **, так как я понимают, что они больше не являются дополнительными для системы соответствия POSIX. – kestasx

+0

Из вашей ссылки «Неизвестно, имеют ли все члены структуры statvfs значимые значения во всех файловых системах». Эти функции являются частью базового стандарта, но не обязаны ** делать что-либо **. –

5

Вы можете использовать -[NSURL getResourceValue:forKey:error:] с ключом NSURLVolumeIsReadOnlyKey. Вы применили бы это к URL-адресу приложения, возвращаемому [[NSBundle mainBundle] bundleURL]. Итак:

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

Не могли бы вы разделить на отдельные вызовы методов, поэтому мне легче копировать с Java с помощью SWT? Заранее спасибо. –

+0

Я отредактировал свой ответ. Это ты имел в виду? –

 Смежные вопросы

  • Нет связанных вопросов^_^