一、应用程序沙盒的基本概念
1、iOS中的沙盒(sandbox)机制
1)iOS应用程序只能对自己创建的文件系统读取文件,这个"独立","封闭","安全"的空间,称之为沙盒,所有的非代码文件都要保存在此。 2)它一般存放着你程序包文件(可执行文件)、图片、声音、视频、plist、sqlite数据库以及其他文件 3)每个应用程序都有自己的独立的存储空间(沙盒),一般情况下应用程序是不可以相互访问沙盒,也有例外,比如系统通讯录能在用户授权的情况下被第三方应用访问
2、沙盒目录文件的组成以及相关含义 (每一个IOS应用系统都有一个沙盒,沙盒里面包括4部分,原则上沙盒之间是不能互相访问的)
当我们创建我们的应用程序时,在每个沙盒中默认含有4个文件,如下: 1.Documnets: 一般我们需要持久的数据都放在这个目录中,你可以在当中添加子文件夹,需要注意的是,Documents 存放不会被删除的文件,iTunes备份和恢复的时候,会包括此目录,不能放太大的文件.不然苹果审核会被拒掉 2.Library: 设置程序的默认设置和其他状态信息 1). Library/Caches:存放缓存文件,应用程序再次启动过程中需要的信息,Caches (缓存) 一般放体积比较大,不重要的资源,itenus不会备份 2). Library/Preferences:包含应用程序的偏好设置文件,preferences 不要随意动他,通过使用NSUserDefault类取得应用程序的偏好,itunes会备份 3.tmp: 创建临时文件的目录,tmp 保存应用的临时数据,itunes不会同步该目录,长时间不用可能会被程序删掉,重启iphone时会被删掉 4.程序.app,与另三个路径的父路径不同 这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动
二、获取沙盒目录
注意:所有的路径都是字符串,接收路径都必须用 NSString *---Path 路径对象名字根据自己的需要来写了
1、获取到沙盒的根目录 NSString *homePath = NSHomeDirectory(); 2、获取Documents目录 NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//没有办法直接用方法得到路径的,就先用这样的方法把目标路径放到数组里面,然后再取到地址 NSString *documentsPath = [paths lastObject]; 3、获取Library中的Cache NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES); NSString *cachePath = [paths lastObject]; 4、获取tmp路径 NSString *tempPath = NSTemporaryDirectory(); 5、获取程序包文件路径 //获取到程序包路径 NSString *boundlePaht = [[NSBundle mainBundle] resourcePath]; NSLog(@"程序包路径=%@",boundlePaht);
三.文件和文件夹的创建过程 (下面的“1”和“2”的内容是不一样的)
1.新建其他文件路径的方法(注意:仅仅是建立文件路径,不是文件夹,也不是文件)
获取沙盒里面已经存在的路径(参考"二"里面的获取方法) 比如我们在tmp文件夹里面新建一个文件"word.text"路径 NSString *tmpPath = NSTempporaryDirectory; NSString *newPath = [tmpPat stringByAppendingPathComponent:@"word.text"];
2.新建一个文件(白色的文件)建一个"乐园.text"文件,只能存放文件内容,而不能存放文件夹
//准备路径 NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"乐园.text"]; //准备内容 NSString *contentStr = @"我喜欢你们"; NSData *contentData = [contentStr dataUsingEncoding:NSUTF8StringEncoding];//计算机只能识别人二进制代码,把字符串转化为计算机能够是别的语言 NSFileManager *fileManager = [NSFileManager defaultManager];//建立一个资源管理器,用来处理文件,单例模式 BOOL isSuccess = YES;
//很关键的一步来真正建立好一个文件
isSuccess = [fileManger createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]; if (isSuccess == YES) { NSLog(@"文件创建成功"); NSLog(@"%@",filePath); }
3.新建一个文件夹(蓝色的文件夹)建一个"乐园.text"文件夹,可以存放文件
//准备路径 NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"乐园.text"]; //准备内容 NSString *contentStr = @"我喜欢你们"; NSData *contentData = [contentStr dataUsingEncoding:NSUTF8StringEncoding];//计算机只能识别人二进制代码,把字符串转化为计算机能够是别的语言 NSFileManager *fileManager = [NSFileManager defaultManager];//建立一个资源管理器,用来处理文件,单例模式 BOOL isSuccess = YES;
//很关键的一步来真正建立好一个文件夹
isSuccess = [fileManager createFileAtPath:filePath contents:contentData attributes:nil]; if (isSuccess == YES) { NSLog(@"文件夹创建成功"); NSLog(@"%@",filePath); }
四、文件目录的处理方法(通过路径来修改)
有些时候我们需要对获取到的文件目录做一些特殊处理,常用的方法有以下几个: NSString *paths = @"/Users/apple/testfile.text"; #pragma mark 1 分解路径中的元素,并放到一个数组里面 NSArray *pathArray = [paths pathComponents]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); #pragma mark 2 获取到路径里面最后一个元素 NSString *path5 = [paths lastPathComponent];或者 NSString *path5 = [paths lastObject]; #pragma mark 3 删除路径里面的最后一个元素 NSString *path6 = [paths stringByDeletingLastPathComponent]; #pragma mark 4 在路径后面拼接元素 NSString *path7 = [paths stringByAppendingPathComponent:@"天下无敌.text"]; #pragma mark 5 获取到文件的扩展名 NSString *path8 = [path7 pathExtension]; //extension |ɪkˈstenʃn| 扩展名 如:.text NSLog(@"%@",path8); #pragma mark 6 删除扩展名 NSString *path9 = [path7 stringByDeletingPathExtension]; #pragma mark 7 增加扩展名 NSString *path10 = [path9 stringByAppendingPathExtension:@"pdf"]; #pragma mark 8 找到桌面上的“截图”文件夹 NSString *path = @"/Users/wangchong/Desktop"; NSString *text = [path stringByAppendingString:@"NSFileMange"];//NSFileMange是我桌面上的文件夹的名字
五.NSData的基本概念(字符串和二进制数据的转换)
NSData是用来包装数据用的 NSData存储的是二进制数据,这样就屏蔽了数据之间的差异,文本、音频、图像等数 据都可以用NSData来存储 NSMutableData继承NSData类,可以对该对象进行数据修改 NSString *test = @"字符串哈哈"; // string -> data NSData *dataTest = [test dataUsingEncoding:NSUTF8StringEncoding]; // data -> string NSString *str = [[NSString alloc]initWithData:dataTest encoding:NSUTF8StringEncoding];
六.计算文件和文件夹的容量
- 第一. 获取文件数据的方式 :
1). 用方法获取
NSData *receiveData = [fileManger contentsAtPath:filePath]; //filePath是有内容的文件路径
2). 创建fileHandle对象
NSFileHandle *fileHandle1 = [NSFileHandle fileHandleForReadingAtPath:filePath]; //filePath是有内容的文件路径 NSData *data = [fileHandle1 readDataToEndOfFile]; //全部读取文件内容
2.计算文件夹的容量
获取到文件夹下的所有文件名,放到一个枚举器里面 NSDirectoryEnumerator *files = [fileManger enumeratorAtPath:direcPath]; 获取到枚举器里面的第一个文件 NSString *path = [files nextObject]; NSInteger fileNum = 0; while (path != nil) { NSLog(@"沙盒=%@",path); //将文件路径拼接完整 NSString *path2 = [direcPath1 stringByAppendingPathComponent:path]; //通过attributesOfItemAtPath获取指定路径文件信息 NSDictionary *attrDic = [fileManger attributesOfItemAtPath:direcPath error:nil]; //获取到文件的大小 NSNumber *fileSize = attrDic[NSFileSize]; //将NSNumber转化为int fileNum = [fileSize intValue]; //取出来下一个文件 path = [files nextObject]; }
七.文件的移动 (对文件的操作都需要通过路径来完成)
切记:文件的移动,移除,复制,更改名字,都需要给它设置一个新的名字
同时文件是不可以放在文件里面的,但是文件是可以放在文件夹里面的
#pragma mark 移动文件 目标路径也需要带一个文件名 NSString *targetPaht = NSHomeDirectory(); targetPaht = [targetPaht stringByAppendingPathComponent:@"test.text"]; Bool isSuccess = [fileManger moveItemAtPath:filePath toPath:targetPaht error:nil]; if (isSuccess == YES) { NSLog(@"移动成功"); } #pragma mark 复制文件 NSString *homeFilePath = NSHomeDirectory(); homeFilePath = [homeFilePath stringByAppendingPathComponent:@"test2.text"]; //在根目录在复制一份文件 Bool isSuccess = [fileManger copyItemAtPath:targetPaht toPath:homeFilePath error:nil]; if (isSuccess == YES) { NSLog(@"复制成功"); } #pragma mark 移除文件 Bool isSuccess = [fileManger removeItemAtPath:filePath error:nill]; if (isSuccess == YES) { NSLog(@"复制成功"); }
八.NFFileHandle的用法(它是用来专门处理文件内容的) 处理完文件一定要记得关闭文件,否则会内存泄漏
//准备路径 NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"Chinese.text"]; //准备内容 NSString *contentStr = @"strf"; NSData *contentData = [contentStr dataUsingEncoding:NSUTF8StringEncoding]; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL isSuccess = YES; isSuccess = [fileManager createFileAtPath:filePath contents:contentData attributes:nil]; if (isSuccess == YES) { NSLog(@"文件创建成功"); NSLog(@"%@",filePath); } #pragma mark 1.追加数据 //获取NSFileHandle对象 NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath]; //指定在哪个位置追加数据 [fileHandle seekToEndOfFile]; NSString *str = @"追加的数据"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; //利用fileHandle向文件写入数据 [fileHandle writeData:data]; //关闭文件 [fileHandle closeFile]; #pragma mark 2.定位读取数据 //创建fileHandle对象 NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath]; //获取到文件中可用数据的大小 NSUInteger length = [fileHandle availableData].length; //指定从哪里开始读取 [fileHandle seekToFileOffset:length/2];//断点续传会保留文件偏移量 //读取数据 NSData *data = [fileHandle readDataToEndOfFile]; //将data转化为string NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); #pragma mark 3.复制文件 NSString *homePath = NSHomeDirectory(); //找到源文件路径 NSString *sourcePath = [homePath stringByAppendingPathComponent:@"Chinese.text"]; //指定目标文件路径 NSString *tagetPath = [homePath stringByAppendingPathComponent:@"复制后.text"]; //创建一个文件管理器对象 NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL success = [fileManager createFileAtPath:tagetPath contents:nil attributes:nil]; if (success) { NSLog(@"create success"); } //通过outFileHandle往文件内写东西 NSFileHandle *outFileHandle = [NSFileHandle fileHandleForWritingAtPath:tagetPath]; //通过inFileHandle读取文件中的内容 NSFileHandle *inFileHandle = [NSFileHandle fileHandleForReadingAtPath:sourcePath]; NSData *data = [inFileHandle readDataToEndOfFile]; NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); [outFileHandle writeData:data]; [outFileHandle closeFile]; [inFileHandle closeFile]; NSLog(@"%@",NSHomeDirectory());
九.总结
掌握:1.沙盒代表一个iOS应用程序的管理器内存地址 2.文件和文件夹的设置以及文件他们的变化 3.内存大小的计算利用利用枚举器和字典 4.NSFileManger和N�SFileHandle的用法,一个应用程序只有一个资源管理器N�SileManger来操作所有的文件,文件内容的操作都用N�SileHandle
十.补充(创建文件夹)
创建的文件夹叫做: /Users/wangchong/Library/Developer/CoreSimulator/Devices/3FCB4033-D0BB-4932-AA85-6A24C9BB4436/data/Containers/Data/Application/1D0F8593-821D-4946-B42E-E1B188DA9993/Documents/wpdf - (NSString *)str:(NSString *)_pdfPath { if (_pdfPath == nil) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *pdfDir = [[paths firstObject] stringByAppendingPathComponent:@"wpdf"]; if ([[NSFileManager defaultManager] fileExistsAtPath:pdfDir]) { return pdfDir; } [[NSFileManager defaultManager] createDirectoryAtPath:pdfDir withIntermediateDirectories:YES attributes:nil error:nil]; _pdfPath = pdfDir; } return _pdfPath; }
欢迎大家指正!!!
如果有帮助请点喜欢,给点鼓励!