APP 的沙盒文档结构、获取沙盒目录
SandBox
- iOS 中每个应用程序都有一个单独封闭的文件夹,这个文件夹称为沙盒(sandbox)
- 沙盒目录用来存放 App 的本地文件
- 当前 APP 应用程序没有权限访问其他 APP 的沙盒。
- 沙盒目录:
- Docunments : 存放长期使用的文件。
- Library : 系统存放文。
- tmp : 临时文件,App 重启时,该目录下的文件清空。
获取沙盒 Home 路径
NSString *homeDir = NSHomeDirectory();
文件路径的追加
NSString *homeDir = NSHomeDirectory();
NSString *documents = [homeDir stringByAppendingString:@"/Documents"];
NSString *documents = [homeDir stringByAppendingPathComponent:@"Documents"]; //注意:不需要加‘/’
获取沙盒下的 Documents 目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documents = [paths lastObject];
NSLog(@"documents = %@",documents);
NSString 处理路径
//演示路径
NSString *path = @"/Users/apple/file.text";
1.获取路径的组成部分 结果: (“/”,”Users”, “apple”, “file.text”)
NSArray *components = [path pathComponents];
2.路径的最后一个组成部分 结果: file.text
NSString *lastName = [path lastPathComponent];
3.追加文件或目录 结果: /Users/apple/file.text/app.text
NSString *filePath = [path stringByAppendingPathComponent:@"app.text"];
4.删除最后部分的组成部分 结果: /Users/apple
NSString *filePath = [path stringByDeletingLastPathComponent];
5. 取路径最后部分的扩展名 结果: text
NSString *extName = [path pathExtension];
6. 追加扩展名 结果: /Users/apple/file.text.jpg
NSString *filePath = [path stringByAppendingPathExtension:@"jpg"];
NSData
NSData 是对数据的一种抽象.
任何数据都可以通过 NSData 来存储,NSMutableData 是可变的,继承于 NSData.
NSString <-> NSData
NSString *s = @"NSData是对数据的一种抽象"; //NSString -> NSData NSData *data1 = [s dataUsingEncoding:NSUTF8StringEncoding]; //NSData -> NSString NSString *s2 =[[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
NSFileManager
- NSFileManager 主要对文件进行管理,主要有如下功能:创建、复制、删除、剪切等
创建文件
//创建 NSFileManager 对象
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSFileManager *fileManager = [NSFileManager defaultManager]; //同上
//1.构造文件的路径
NSString *homePath = NSHomeDirectory();
NSString *filePath = [homePath stringByAppendingPathComponent:@"file.txt"];
//2.构造数据
NSString *string = @"Hello World!";
//3.将字符串中的文本数据存储到Data对象中
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//4.创建文件
//createFileAtPath 创建文件,如果文件已经存在,那么新创建的文件会将原文件覆盖
BOOL success = [fileManager createFileAtPath:filePath //路径
contents:data //数据
attributes:nil]; //属性
if (success) {
NSLog(@"create file success");
}
创建文件夹
[fileManager createDirectoryAtPath:(NSString *) withIntermediateDirectories:(BOOL) attributes:(NSDictionary *) error:(NSError *__autoreleasing *)]
读取文件
//创建 NSFileManager 对象
NSFileManager *fileManager = [NSFileManager defaultManager];
//构造文件的路径
NSString *homePath = NSHomeDirectory();
NSString *filePath = [homePath stringByAppendingPathComponent:@"file.txt"];
//根据路径读取文件
NSData *fileData = [fileManager contentsAtPath:filePath];
//将NSData转NSString
NSString *content = [[NSString alloc] initWithData:fileData
encoding:NSUTF8StringEncoding];
移动,剪切文件
NSFileManager *fileManager = [NSFileManager defaultManager];
//构造路径
//文件的原路径
NSString *srcPath = [NSHomeDirectory() stringByAppendingPathComponent:@"file.txt"];
//文件剪切之后的路径
NSString *toPath = [NSHomeDirectory() stringByAppendingPathComponent:@"temp/file.txt"];
//注意:如果目标路径已经存在此文件,那么会导致操作失败
NSError *error = nil;
BOOL success = [fileManager moveItemAtPath:srcPath
toPath:toPath
error:&error];
if (!success) {
NSLog(@"剪切失败,%@",error);
}
复制文件
NSFileManager *fileManager = [NSFileManager defaultManager];
//1.构造路径
//文件的原路径
NSString *srcPath = [NSHomeDirectory() stringByAppendingPathComponent:@"temp/file.txt"];
//文件复制之后的路径
NSString *toPath = [NSHomeDirectory() stringByAppendingPathComponent:@"file.txt"];
BOOL success = [fileManager copyItemAtPath:srcPath
toPath:toPath
error:nil];
/注意:如果目标路径已经存在此文件,那么会导致操作失败
if (!success) {
NSLog(@"复制失败");
}
删除文件
NSFileManager *fileManager = [NSFileManager defaultManager];
//1.构造文件路径
NSString *toPath = [NSHomeDirectory() stringByAppendingPathComponent:@"file.txt"];
//2.判断文件是否存在
BOOL exist = [fileManager fileExistsAtPath:toPath];
if (exist) {
//3.删除文件
if ([fileManager removeItemAtPath:toPath error:nil]) {
NSLog(@"删除文件成功");
}
}
删除文件夹
NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@"temp"];
[fileManager removeItemAtPath:dir error:nil];
文件属性
NSFileManager *fileManager = [NSFileManager defaultManager];
//1.构造文件路径
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"file.txt"];
//获得文件的属性字典
NSDictionary *fileAttribute = [fileManager attributesOfItemAtPath:filePath error:nil];
NSLog(@"%@",fileAttribute);
//获取文件大小
NSNumber *fileSize = [fileAttribute objectForKey:@"NSFileSize"];
long size = [fileSize longValue];
NSLog(@"size = %ld",size);
获取文件夹中所有的文件
NSFileManager *fileManager = [NSFileManager defaultManager];
//1.构造路径
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"壁纸"];
//2.获取文件夹中所有的子文件路径(路径是相对路径)
NSArray *subPaths = [fileManager subpathsOfDirectoryAtPath:filePath error:nil];
//3.遍历每一个子路径
long sum = 0;
for (NSString *subpath in subPaths) {
//4.子路径与父路径拼接
NSString *path = [filePath stringByAppendingPathComponent:subpath];
//5.获取文件的属性,计算所有文件占用内存大小
NSDictionary *fileAttribute = [fileManager attributesOfItemAtPath:path error:nil];
NSNumber *filesize = fileAttribute[@"NSFileSize"];
long size = [filesize longValue];
sum += size;
}
//6.单位换算
float result = sum / (1000*1000.0);
NSLog(@"result = %.1f",result);
写文件
- 数组、字典、字符串、NSData 都是容纳数据的,他们都有一个 writeToFile 方法,将数据写入文件。
- 数组、字典写入的文件叫属性列表 (plist) 文件,可以用 xcode 打开编辑。
- 数组只能将如下数据类型写入文件,如果包含其他对象,将写入失败。NSNumber、NSString、NSData、NSDate、NSArray、NSDictionary
//数组写文件
NSString *s1 = @"zhangsan";
NSString *s2 = @"lisi";
NSArray *array = [NSArray arrayWithObjects:s1,s2, nil];
// 将数组中的数据写入文件
[array writeToFile:path atomically:YES];
读文件
//数组读文件
//1.通过alloc创建,并读入文件数据
NSArray *alloc = [[NSArray alloc] initWithContentsOfFile:path];
//2.通过类方法创建,并读入文件数据
MSArray *array = [NSArray arrayWithContentsofFile:path];