如何为File Manager创建的文件夹设置密码?fileSecurity使用方法
回答
fileSecurity 实现不了你要的文件夹独立密码加密需求。
fileSecurity 的实际用途
这个类是用来管理文件系统层面的访问权限的,能配置的只有三类内容:
- POSIX 标准的读/写/执行权限位
- 文件/文件夹的所有者、所属用户组
- ACL 访问控制规则
它的权限逻辑完全和系统账号绑定:比如你可以设置文件夹只允许当前登录的系统账号访问,其他系统账号登录后打不开,但它不支持给文件夹设置单独的访问密码——只要是有权限的系统账号操作,不会弹出任何密码验证步骤,直接就能访问内容。
fileSecurity 的使用方法
如果你只是需要限制其他系统账号访问文件夹,可以直接修改你现有的创建文件夹代码,把配置好的fileSecurity对象作为属性传入创建接口即可:
func createNewDirectory(addPath: String, myFile: MyFile) { guard let mainURL = takeMainDirectoryURL(addPath: addPath, myFile: myFile) else { return } let path = mainURL.path do { let fileSecurity = NSFileSecurity() // 0o700 权限代表仅文件夹所有者拥有读、写、遍历权限,其余系统用户无任何访问权 fileSecurity.posixPermissions = 0o700 try manager.createDirectory( atPath: path, withIntermediateDirectories: true, attributes: [.fileSecurity: fileSecurity] ) } catch let error { print("Error Description: \(error.localizedDescription)") } }
如果需要读取现有文件/文件夹的权限配置,在调用resourceValues(forKeys:)时传入.fileSecurityKey就能拿到对应的NSFileSecurity实例。
文件夹密码保护的可行实现方案
Apple 全平台没有提供给普通文件夹加独立密码的原生API,要实现输入密码才能访问的效果,目前可行的方案有两种:
- 加密磁盘镜像方案:创建AES加密的稀疏磁盘镜像,把需要保护的内容全部放在镜像内,挂载镜像时系统会自动要求输入密码。可以通过
DiskArbitration框架或者调用系统内置的hdiutil命令行工具完成镜像的创建、挂载、卸载操作,不需要自己实现加密逻辑。 - 内容级加密方案:自己实现对称加解密逻辑,写入文件时用用户输入的密码派生AES密钥加密文件内容,读取时要求用户输入密码解密后再加载。这种方案灵活度最高,但需要自己处理文件遍历、加解密、密钥管理的全流程逻辑。
额外提一句:你当前代码里用isHidden属性标记锁定状态的方式没有实际防护能力,用户只要在访达里开启显示隐藏文件就能直接看到所有内容,完全挡不住访问。
内容的提问来源于stack exchange,提问作者Ufuk Köşker
相关产品推荐
相关产品推荐

