沙盒SandBox
向沙盒写文件和读文件
文件管理NSFileManager
图片下载
创建文件夹
创建文件
复制文件
剪切文件/文件夹
删除文件
查询文件夹下的文件
文件内容管理NSFileHandle
写文件
读文件
对大文件进行写入
字符串转化为本地URL
沙盒SandBox
类似于古代行军打仗用的沙盘, 一个沙盘代表一个世界.
在iOS中, 每个ipa应用文件, iOS系统都会给它开辟一个独立的存储空间(磁盘空间),
这些ipa的磁盘空间在非越狱情况下, 是无法互相交流的.这是为了保证安全
//查找ipa文件--程序文件存储位置, Bundle:束
NSString*ipaPath = [[NSBundlemainBundle] bundlePath];
NSLog(@"ipaPath: %@", ipaPath);
returnYES;
//Directory: 文件夹
//Domain: 域, 领域
//expand 拓展tilde波浪字符 ~/Docuemnts
/*
参数1: 枚举类型,代表要查找的文件夹类型
参数2: 代表搜索的范围
参数3: YES代表 展开波浪, 即 全路径
*/
NSString*docPath0 =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
NSLog(@"docPath0: %@", docPath0);
//LibraryNSLibraryDirectory
NSString*libPath0 =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES).firstObject;
NSLog(@"libPath0: %@", libPath0);
//Library/CachesNSCachesDirectory
NSString*cachePath =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES).firstObject;
NSLog(@"cachePath: %@", cachePath);
//获取tmp路径
NSString*tmpPath0 =NSTemporaryDirectory();
NSLog(@"tmpPath0: %@", tmpPath0);
returnYES;
//沙盒中默认有几个文件夹, 用于存放数据
//获取沙盒路径--每次获取都不同,文件夹名称被加密
//模拟器可以通过 Finder的前往文件夹功能查看沙盒.
//真机从iOS9开始不再允许使用软件访问沙盒
NSString*rootPath =NSHomeDirectory();
NSLog(@"rootPath: %@", rootPath);
//获取Document文件夹-> root/Documents
//下方方法会在拼接字符串时,自动在中间添加 /
NSString*docPath = [rootPath stringByAppendingPathComponent:@"Documents"];
NSLog(@"docPath: %@", docPath);
//Library
NSString*libPath = [rootPath stringByAppendingPathComponent:@"Library"];
NSLog(@"libPath: %@", libPath);
//tmp
NSString*tmpPath = [rootPath stringByAppendingPathComponent:@"tmp"];
NSLog(@"tmpPath: %@", tmpPath);
向沙盒写文件和读文件
NSString*docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
NSLog(@"docPath: %@", docPath);
//字典写文件--> ~/Documents/字典
NSDictionary*dic = @{@"name":@"1511A",
@"日期":@"20160127",
@"学生":@[@"张三",@"李四"],
@"学号": @221212312};
//拼出文件地址
NSString*dicPath = [docPath stringByAppendingPathComponent:@"字典"];
//写入文件
[dic writeToFile:dicPath atomically:YES];
//读出文件内容
NSDictionary*readDic = [NSDictionarydictionaryWithContentsOfFile:dicPath];
NSLog(@"readDic %@", readDic);
returnYES;
//数组写文件---> ~/Documents/数组
NSArray*arr = @[@"腾讯",
@1,
@YES,
@{@"name":@"1511A"}];
NSString*arrPath = [docPath stringByAppendingPathComponent:@"数组"];
[arr writeToFile:arrPath atomically:YES];
NSArray*readArr = [NSArrayarrayWithContentsOfFile:arrPath];
NSLog(@"readArr: %@", readArr);
returnYES;
//把字符串 写到 ~/Documents/文本
NSString*txtPath = [docPath stringByAppendingPathComponent:@"文本"];
/*
参数1: 文件的路径
参数2: YES代表生成辅助文件, 写入的时候先写到辅助文件里, 写完以后再复制到真实目录下. 这样可以防止中途发生问题
参数3: 编码, 通常都使用UTF8编码
参数4: 二级指针 **类型, 当有错误发生时,就会对这个指针进行赋值
*/
NSError*error =nil;
[@"kkwerqesadfewqrsdf"writeToFile:txtPath atomically:YESencoding:NSUTF8StringEncodingerror:&error];
if(error) {
NSLog(@"error %@", error);
}
NSLog(@"docPath: %@", docPath);
//读取文件--要使用与文件内容匹配的类型来读取文件内容
NSString*content = [NSStringstringWithContentsOfFile:txtPath encoding:NSUTF8StringEncodingerror:&error];
NSLog(@"content: %@", content);
文件管理NSFileManager
图片下载
使用多线程下载图片, 下载完毕以后存储在硬盘上. 当再次下载时, 从硬盘读取, 不再请求.
NSString*address =@"http://h.hiphotos.baidu.com/image/pic/item/9d82d158ccbf6c812f9fe0e1be3eb13533fa400b.jpg";
//1.下载图片
//2.图片存本地
//3.读取本地图片显示在界面上
NSString*imageName = address.lastPathComponent;
NSString*docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
//拼接地址
NSString*path = [docPath stringByAppendingPathComponent:imageName];
//文件管理类: 可以对文件/文件夹进行 增删改移动等操作
NSFileManager*manager = [NSFileManagerdefaultManager];
//判断某个文件是否存在 exist
BOOLfileExist = [manager fileExistsAtPath:path];
if(fileExist) {
_imageView.image= [UIImageimageWithContentsOfFile:path];
NSLog(@"path %@", path);
return;//下方代码不再执行
}
[[NSOperationQueuenew] addOperationWithBlock:^{
NSData*data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:address]];
//写入到~/Documents/'图片名'
//取得地址中最后/后面的部分,作为图片名
//data ->写入->文件中
[data writeToFile:path atomically:YES];
NSLog(@"path %@", path);
UIImage*image= [UIImageimageWithContentsOfFile:path];
//回主线程 把图片给用户看
[[NSOperationQueuemainQueue] addOperationWithBlock:^{
_imageView.image= image;
}];
}];
创建文件夹
NSString*dir0 = [self.docPathstringByAppendingPathComponent:@"dir0"];
NSString*dir1 = [self.docPathstringByAppendingPathComponent:@"dir1"];
//文件管理器
NSFileManager*manager = [NSFileManagerdefaultManager];
/*
参数2:自动创建中间文件夹. ~/Docments/2/3
如果2文件夹不存在?
那么参数是YES,表示自动创建2
参数是NO, 表示不创建2, 3就会创建失败
*/
[manager createDirectoryAtPath:dir0 withIntermediateDirectories:YESattributes:nilerror:nil];
[manager createDirectoryAtPath:dir1 withIntermediateDirectories:YESattributes:nilerror:nil];
创建文件
//通过文件管理器创建文件
NSString*dir0Txt = [dir0 stringByAppendingPathComponent:@"dir0.txt"];
NSString*dir1Txt = [dir1 stringByAppendingPathComponent:@"dir1.txt"];
[manager createFileAtPath:dir0Txt contents:nilattributes:nil];
[manager createFileAtPath:dir1Txt contents:nilattributes:nil];
复制文件
NSString*dir1Txt = [self.docPathstringByAppendingPathComponent:@"dir1/dir1.txt"];
// dir0/dir1New.txt
NSString*dir1_New = [self.docPathstringByAppendingPathComponent:@"dir0/dir1New.txt"];
[[NSFileManagerdefaultManager] copyItemAtPath:dir1Txt toPath:dir1_New error:nil];
剪切文件/文件夹
NSString*dir0Txt = [self.docPathstringByAppendingPathComponent:@"dir0/dir0.txt"];
NSString*dir0_new = [self.docPathstringByAppendingPathComponent:@"dir1/dir1_new.txt"];
[[NSFileManagerdefaultManager] moveItemAtPath:dir0Txt toPath:dir0_new error:nil];
删除文件
[[NSFileManager defaultManager]removeItemAtPath:nil error:nil];
查询文件夹下的文件
NSString*dir1 = [self.docPathstringByAppendingPathComponent:@"dir1"];
NSFileManager*manager = [NSFileManagerdefaultManager];
NSArray*arr = [manager subpathsAtPath:dir1];
文件内容管理NSFileHandle
写文件
//创建文件
- (void)createFile{
//1.创建一个空白的文件 ~/Documents/File.txt
NSString*path = [kDocPath stringByAppendingPathComponent:@"File.txt"];
[[NSFileManagerdefaultManager] createFileAtPath:path contents:nilattributes:nil];
NSLog(@"path %@", path);
//2.通过fileHandle向文件中写入内容
//fileHandle 分为写操作和读操作
NSFileHandle*fileHandle = [NSFileHandlefileHandleForWritingAtPath:path];
//准备写入的内容
NSString*content =@"使用FileHandle写入内容";
//开始写
[fileHandle writeData:[content dataUsingEncoding:NSUTF8StringEncoding]];
//关闭写入操作
[fileHandle closeFile];
}
读文件
//写小的文件内容--复制
- (void)copySmallFile{
//操作:把File.txt中的内容读出来, 然后写入到文件Target.txt中
NSString*path = [kDocPath stringByAppendingPathComponent:@"File.txt"];
NSFileHandle*readHandle = [NSFileHandlefileHandleForReadingAtPath:path];
//使用读操作 读取全部内容
NSData*data = [readHandle readDataToEndOfFile];
[readHandle closeFile];
NSString*targetPath = [kDocPath stringByAppendingPathComponent:@"Target.txt"];
[[NSFileManagerdefaultManager] createFileAtPath:targetPath contents:data attributes:nil];
NSLog(@"%@", kDocPath);
}
对大文件进行写入
//写大的文件内容- 复制(准备一个pdf)
- (void)copyBigFile{
//内存只有2G, 当要写一个超过2G的文件时,就不能够直接把文件都读取到内存中,再写入.需要分段读写
//拿到ipa目录下的pdf文件路径, Day19.pdf
NSString*pdfPath = [[NSBundlemainBundle] pathForResource:@"Day19"ofType:@"pdf"];
//创建要写入的文件 ~/Documents/target.pdf
NSString*targetPath = [kDocPath stringByAppendingPathComponent:@"Day19.pdf"];
[[NSFileManagerdefaultManager] createFileAtPath:targetPath contents:nilattributes:nil];
NSLog(@"taregetPath %@", targetPath);
//读源文件
NSFileHandle*readHandle = [NSFileHandlefileHandleForReadingAtPath:pdfPath];
//写到目标文件
NSFileHandle*writeHandle = [NSFileHandlefileHandleForWritingAtPath:targetPath];
//每次读取的大小 单位是字节
NSIntegersizePerTime =5000;
//当前已经读取的大小
NSIntegerreadSize =0;
//获取源文件的属性, 可以自己NSLog看字典内容
NSDictionary*attr = [[NSFileManagerdefaultManager] attributesOfItemAtPath:pdfPath error:nil];
//总大小
NSNumber*fileTotalSize = attr[NSFileSize];
NSIntegerfileTotalLenght = fileTotalSize.integerValue;
//标识: 控制当前循环是否要继续
BOOLnotEnd =YES;
//记录共循环了多少次
intcount =0;
while(notEnd) {
//计算剩余数据长度
NSIntegerleftLength = fileTotalLenght - readSize;
NSData*data =nil;
if(leftLength >= sizePerTime) {
//剩余内容足够再读取至少一次
data = [readHandle readDataOfLength:sizePerTime];
//每次读取,都把已经读取的长度加上5000,并且把读操作的指针挪到新的开始位置
readSize += sizePerTime;
[readHandle seekToFileOffset:readSize];
}else{
//不足一次
notEnd =NO;
//把剩下的读完
data = [readHandle readDataOfLength:leftLength];
}
[writeHandle writeData:data];//写入数据
count ++;//读取次数加1
}
NSLog(@"共读取%d次, 路径%@", count, targetPath);
}
字符串转化为本地URL
NSString*dir0 = [self.docPathstringByAppendingPathComponent:@"dir0"];
//文件路径 URL类型
NSURL*fileURL = [NSURLfileURLWithPath:dir0];