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

Java 检测应用程序是否从OS X上的只读文件系统启动,java,macos,dmg,Java,Macos,Dmg,我想知道用户是否从只读文件系统(如从.dmg)启动了基于Java的应用程序,因此像auto update这样的函数将能够显示有意义的信息,而不是因错误而中止。我首先认为检查.app的路径就足够了(当从.dmg启动时,它类似于/Volumes/MyApp 1.2.3/MyApp.app,但这不起作用,因为用户可能已将应用程序安装在不同的分区上。我还可以检查哪些其他事项?如果OSX与POSIX兼容,要确定文件系统是否已安装R/O,可以使用statvfs()或fstatvfs(),返回的struct

我想知道用户是否从只读文件系统(如从.dmg)启动了基于Java的应用程序,因此像auto update这样的函数将能够显示有意义的信息,而不是因错误而中止。我首先认为检查.app的路径就足够了(当从.dmg启动时,它类似于
/Volumes/MyApp 1.2.3/MyApp.app
,但这不起作用,因为用户可能已将应用程序安装在不同的分区上。我还可以检查哪些其他事项?

如果OSX与POSIX兼容,要确定文件系统是否已安装R/O,可以使用
statvfs()
fstatvfs()
,返回的
struct statvfs
字段
f_标志
应为R/O文件系统设置
ST_RDONLY

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

这个问题可能对Java有用

还有一些有用的想法(
access()
open()
utime()


也可以使用特定于OS X的操作系统,但此函数不可移植(Linux和*BSD的函数稍有不同)。

您可以使用
-[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检查某个路径是否指向只读目录中的某个内容:

 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();

您对只读的定义是什么?如果文件系统是可写的,但用户没有修改应用程序包的权限,该怎么办?这符合条件吗?不,因为应用程序可以请求权限。实际上,兼容POSIX并不意味着可以使用
statvfs()
了解文件系统是否是只读的。声明说POSIX实际上不需要这些函数来做任何事情,便携式应用程序也不应该使用这些函数。鉴于这个问题是针对OS X的,在这种情况下可以使用它们,但你暗示可以在任何符合POSIX的操作系统上使用它们是不正确的。@KenThomases,在“第7期”中说,这些函数从XSI移到了Base,因此据我所知,它们对于POSIX conformat系统不再是可选的。从您的链接“未指定statvfs结构的所有成员是否在所有文件系统上都具有有意义的值”。这些函数是基本标准的一部分,但不需要执行任何操作。如何使用Java实现这一点?能否将它们拆分为单独的方法调用,以便我更容易使用SWT从Java复制?提前感谢。