0%

Objective-C_SandBox&NSFileManager

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];

欢迎关注我的其它发布渠道