Я хочу знать, запускает ли пользователь наше Java-приложение из файловой системы только для чтения, например, из .dmg, поэтому функции, обновление сможет отображать значимую информацию, а не прерывать с ошибкой. Сначала я думал, что проверка пути .app будет достаточной (при запуске из .dmg это что-то вроде /Volumes/MyApp 1.2.3/MyApp.app
, но это не сработает, потому что пользователь мог установить приложение на другой раздел. Что еще я могу проверить ?Обнаружение того, было ли приложение запущено из файловой системы только для чтения в OS X
ответ
Вы также можете проверить непосредственно из 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();
Если 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()
).
На самом деле, будучи совместимым с POSIX, ** не ** означает, что можно использовать 'statvfs()', чтобы узнать, доступна ли файловая система только для чтения. В [man page] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/statvfs.3.html) говорится, что POSIX фактически не требует выполнения этих функций * ничего * и что они не должны использоваться портативными приложениями. Учитывая, что вопрос был специфичен для OS X, их можно было использовать в этом случае, но ваш вывод о том, что их можно использовать в любой ОС, совместимой с POSIX, неверен. –
@KenThomases, http://pubs.opengroup.org/onlinepubs/9699919799/functions/statvfs.html говорит, что из «Проблема 7» эти функции перемещаются в ** Base ** из ** XSI **, так как я понимают, что они больше не являются дополнительными для системы соответствия POSIX. – kestasx
Из вашей ссылки «Неизвестно, имеют ли все члены структуры statvfs значимые значения во всех файловых системах». Эти функции являются частью базового стандарта, но не обязаны ** делать что-либо **. –
Вы можете использовать -[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
}
Не могли бы вы разделить на отдельные вызовы методов, поэтому мне легче копировать с Java с помощью SWT? Заранее спасибо. –
Я отредактировал свой ответ. Это ты имел в виду? –
Что именно ваше определение только для чтения? Что делать, если файловая система доступна для записи, но у пользователя отсутствуют разрешения на изменение пакета приложений? Будет ли это соответствовать? – NPE
Нет, поскольку приложение может запрашивать разрешения. –