一、iOS文件系统概述
iOS是移动操作系统,它的文件系统是相对封闭的。和其他的操作系统类似,iOS文件系统也是一个层级结构,但是因为苹果的一些保护措施,使得用户的自由度和开发者的难度都增加了不少。
iOS文件系统包括以下几个目录:
/
– 根目录/Applications
– 存放应用程序/Documents
– 存放应用程序专有数据文件,iTunes备份包括此目录/Library
– 存放共享资源文件和其他应用程序需要的数据文件/private/var/mobile
– 存放用户数据,比如短信等/tmp
– 存放临时文件,重启后自动清空
为了保护系统安全,应用程序只能访问自己应用目录下的文件。在用户非越狱的情况下,应用程序无法直接访问其它应用程序的文件,这样就保证了用户的隐私安全。
二、文件读写
iOS上常见的文件读写方式有以下几种:
1. NSFileManager
NSURL *documentDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *fileURL = [documentDirectory URLByAppendingPathComponent:@"filename.txt"];
NSString *content = @"Hello, world!";
[content writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSString *result = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", result);
使用NSFileManager可以方便地进行本地文件的读写,但只适用于小文件读写。
2. NSData
NSURL *documentDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *fileURL = [documentDirectory URLByAppendingPathComponent:@"filename.txt"];
NSString *content = @"Hello, world!";
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
[data writeToURL:fileURL atomically:YES];
NSData *resultData = [NSData dataWithContentsOfURL:fileURL];
NSString *result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
使用NSData进行文件读写可以处理大文件,但是需要注意内存占用问题。
3. NSFileHandle
NSURL *documentDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *fileURL = [documentDirectory URLByAppendingPathComponent:@"filename.txt"];
NSString *content = @"Hello, world!";
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingToURL:fileURL error:nil];
[fileHandle writeData:data];
[fileHandle closeFile];
NSData *resultData = [NSData dataWithContentsOfURL:fileURL];
NSString *result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
NSFileHandle可以使用类似于C语言的方式处理文件,可以更加高效地读写大文件。
三、文件夹操作
iOS文件系统中,文件夹操作主要包括以下几个方面:
1. 创建文件夹
NSString *directoryPath = @"path/to/folder";
[[NSFileManager defaultManager] createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:nil];
NSFileManager提供了创建文件夹的函数。
2. 删除文件夹
NSString *directoryPath = @"path/to/folder";
[[NSFileManager defaultManager] removeItemAtPath:directoryPath error:nil];
NSFileManager提供了删除文件夹的函数。
3. 遍历文件夹
NSString *directoryPath = @"path/to/folder";
NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil];
for (NSString *fileName in fileNames) {
NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName];
NSLog(@"%@", filePath);
}
使用NSFileManager可以方便地遍历目录下的文件。
四、文件权限控制
iOS系统对文件的权限管理非常严格,只有通过系统API才能够进行文件的读写操作。
1. 文件权限
iOS系统中,文件的权限通过文件的mode属性进行控制。文件的mode以三个八进制数表示,每个数字控制一个访问者的权限。其中,最高位表示文件类型(文件或目录),后面9位分别代表拥有者、群组和其他用户的权限。
// rwxrwxrwx
int fileMode = S_IRWXU | S_IRWXG | S_IRWXO;
[[NSFileManager defaultManager] setAttributes:@{NSFilePosixPermissions: @(fileMode)} ofItemAtPath:@"path/to/file" error:nil];
NSFileManager中的setAttributes函数可以用来设置文件的mode属性。
2. 访问保护
iOS系统还提供了access、stat等函数来判断文件是否存在、可读写等。
NSString *path = @"path/to/file";
if (access([path UTF8String], F_OK) == 0) {
// 文件存在
}
五、总结
iOS文件管理是与系统操作息息相关的重要方面。在了解完文件系统的结构和各种操作之后,开发者可以针对具体应用场景使用不同的文件读写方式和文件夹操作方法。在进行文件权限控制时,需要特别注意iOS系统的保护措施,避免影响用户数据的安全和隐私。