从El Capitan开始,系统获得了系统完整性保护,不允许某些文件夹和文件的某些活动.使用终端"ls lO"命令,您可以看到特定文件或文件夹具有的标志.
drwxr-xr-x@ 3 root wheel hidden 96 Aug 12 2014 opt
drwxr-xr-x 6 root wheel sunlnk,hidden 192 Nov 28 15:14 private
drwxr-xr-x@ 64 root wheel restricted,hidden 2048 Nov 29 13:48 sbin
lrwxr-xr-x@ 1 root wheel restricted,hidden 11 Nov 28 15:13 tmp -> private/tmp
drwxr-xr-x@ 10 root wheel restricted,hidden 320 Nov 28 15:21 usr
lrwxr-xr-x@ 1 root wheel restricted,hidden 11 Nov 28 15:13 var -> private/var
Run Code Online (Sandbox Code Playgroud)
我对"限制"标志感兴趣.如何在不执行终端命令的情况下使用Swift找到它?
我想强调的是,在代码中执行Process()并不是一种适合需求的方法.
可以通过此处URLResourceKey的 "isHidden"属性检测"隐藏"标志.然而,没有什么关于"受限制".
有人能指出我正确的方向吗?
该工具-O上的选项列出的内容ls是文件标志.这些可以由stat()BSD层中的函数读取,并且可以在st_flags结果结构的字段中找到.
输出中的"受限制"标志ls对应SF_RESTRICTED,所以你可以通过这样的方式读取它:
func isRestricted(at url: URL) throws -> Bool {
let flags: UInt32 = try url.withUnsafeFileSystemRepresentation { fsRep in
var info = stat()
if stat(fsRep, &info) != 0 {
guard let code = POSIXError.Code(rawValue: errno) else {
throw CocoaError(.fileReadUnknown)
}
throw POSIXError(code)
}
return info.st_flags
}
return flags & UInt32(bitPattern: SF_RESTRICTED) != 0
}
Run Code Online (Sandbox Code Playgroud)