检测应用程序是否是从OS X上的只读文件系统启动的

时间:2014-12-25 10:04:20

标签: java macos dmg

我想知道用户是否从只读文件系统(如.dmg)启动了基于Java的应用程序,因此自动更新等功能将能够显示有意义的信息,而不是因错误而中止。我首先想到检查.app的路径就足够了(从.dmg启动时它就像/Volumes/MyApp 1.2.3/MyApp.app,但这不起作用,因为用户可能已经在不同的分区上安装了应用程序。还有什么其他的我可以检查一下吗?

3 个答案:

答案 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文件系统设置位。

正如评论中指出的那样,检查操作系统是否正确提供了此信息。

JNAthis问题可能对Java有用。

还有一些想法可能很有用hereaccess()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();