我想知道用户是否从只读文件系统(如.dmg)启动了基于Java的应用程序,因此自动更新等功能将能够显示有意义的信息,而不是因错误而中止。我首先想到检查.app的路径就足够了(从.dmg启动时它就像/Volumes/MyApp 1.2.3/MyApp.app
,但这不起作用,因为用户可能已经在不同的分区上安装了应用程序。还有什么其他的我可以检查一下吗?
答案 0 :(得分:5)
您可以将-[NSURL getResourceValue:forKey:error:]
与密钥NSURLVolumeIsReadOnlyKey
一起使用。您可以将此应用于[[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
}
答案 1 :(得分:3)
如果OSX符合POSIX,要确定文件系统是否已挂载R / O,您可以使用statvfs()
或fstatvfs()
,返回的struct statvfs
字段f_flag
应该ST_RDONLY
1}}为R / O文件系统设置位。
正如评论中指出的那样,检查操作系统是否正确提供了此信息。
还有一些想法可能很有用here(access()
,open()
,utime()
)。
也可以使用OS X特定statfs()
,但此功能不可移植(Linux和* BSD的功能略有不同statfs()
)。
答案 2 :(得分:1)
您还可以通过查询与您的路径相关联的FileStore
,直接从Java检查特定路径是否指向只读目录中的内容:
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();