iOS 设置目录或文件的访问权限

1,507 阅读1分钟

0x01 相关API

NSFileManager
/* setAttributes:ofItemAtPath:error: returns YES when the attributes specified in the
'attributes' dictionary are set successfully on the item specified by 'path'. If this
method returns NO, a presentable NSError will be provided by-reference in the 'error'
parameter. If no error is required, you may pass 'nil' for the error.
This method replaces changeFileAttributes:atPath:.
*/
- (BOOL)setAttributes:(NSDictionary<NSFileAttributeKey, id> *)attributes 
         ofItemAtPath:(NSString *)path 
                error:(NSError **)error 
                API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));

0x02 NSFilePosixPermissions取值说明

Number权限说明Ref
0No permission---
1Execute permission--x
2Write permission-w-
3Execute and write permission: 1 (execute) + 2 (write) = 3-wx
4Read permissionr--
5Read and execute permission: 4 (read) + 1 (execute) = 5r-x
6Read and write permission: 4 (read) + 2 (write) = 6rw-
7All permissions: 4 (read) + 2 (write) + 1 (execute) = 7rwx

0x03 设置只读属性

NSDictionary *attributes = @{ NSFilePosixPermissions : @(0544) };
NSFileManager *manager = [NSFileManager defaultManager];
BOOL success = [manager setAttributes:attributes ofItemAtPath:path error:error];

注意:设置只读属性后通过NSFileManager的API删除,就会报错,提示权限不够。

0x04 设置读写属性

NSDictionary *attributes = @{ NSFilePosixPermissions : @(0755) };
NSFileManager *manager = [NSFileManager defaultManager];
BOOL success = [manager setAttributes:attributes ofItemAtPath:path error:error];

0x05 PS

  1. 网上说的将NSFilePosixPermissions设置成@(0444)就可以了,但是我在测试时,如果直接设置成会@(0444),结果返回YES,但同时也会将目录里的文件和子目录清空,这肯定是不行的。
  2. 当设置目录访问权限为@(0544)后,删除目录内的非目录文件会提示权限不够;但是如果删除子目录内的文件则不会提醒权限,还是会删除成功。所以为了保证删除设置目录内的任意文件都提示权限不够,应该递归的将所有子目录的访问权限也同时设置成只读。
  3. NSFilePosixPermissions更多的细节:www.tutorialspoint.com/unix/unix-f…