沙盒 文件

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容