Java 检测应用程序是否从OS X上的只读文件系统启动
我想知道用户是否从只读文件系统(如从.dmg)启动了基于Java的应用程序,因此像auto update这样的函数将能够显示有意义的信息,而不是因错误而中止。我首先认为检查.app的路径就足够了(当从.dmg启动时,它类似于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
/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复制?提前感谢。