Я хочу знать, запустил ли пользователь наше приложение на основе Java из файловой системы, доступной только для чтения, например из .dmg, чтобы такие функции, как автоматическое обновление, могли отображать значимую информацию вместо прерывания с ошибкой. Сначала я подумал, что достаточно проверить путь .app (при запуске из .dmg это что-то вроде /Volumes/MyApp 1.2.3/MyApp.app
, но это не сработает, потому что пользователь мог установить приложение на другой раздел. Что еще я могу проверить ?
Определение того, было ли приложение запущено из файловой системы только для чтения в OS X
Ответы (3)
Вы также можете проверить непосредственно из 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();
Вы можете использовать -[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
}
Если OSX совместима с POSIX, чтобы определить, смонтирована ли файловая система R/O, вы можете использовать statvfs()
или fstatvfs()
, в возвращаемом struct statvfs
поле f_flag
должен быть установлен бит ST_RDONLY
для файловой системы R/O.
Как было указано в комментариях, проверьте, правильно ли эта информация предоставляется ОС.
JNA и этот вопрос может быть полезен для Java.
Еще несколько идей, которые могут быть полезны здесь (access()
, open()
, utime()
).
Специфичные для OS X statfs()
также могут использоваться, но эта функция не является переносимой (Linux и *BSD имеют немного разные функции statfs()
) .
statvfs()
, чтобы узнать, доступна ли файловая система только для чтения. справочная страница говорит что POSIX на самом деле не требует, чтобы эти функции делали что-либо и что они не должны использоваться переносимыми приложениями. Учитывая, что вопрос был специфичен для OS X, в этом случае их можно было бы использовать, но ваш вывод о том, что их можно использовать в любой ОС, совместимой с POSIX, неверен.
- person Ken Thomases; 25.12.2014