当前位置:首页 > 操作系统 > Ios

IOS 文件系统

一、文件目录

ios中每个应用程序都是一个沙盒,有自己的沙盒目录,app之间无法访问对方的沙盒文件。

三种沙盒目录:

library:系统存放文件

documents:存放长期使用的文件

temp:临时目录,app重启时,该目录下的文件清空

获取沙盒目录,有两种方式:

1、手动拼接

nsstring *homepath = nshomedirectory();  

nslog(@"沙盒目录:%@",homepath);

2、直接使用api

nsarray *array = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes);  

nsarray *array1 = nssearchpathfordirectoriesindomains(nslibrarydirectory, nsuserdomainmask, yes);

二、文件操作

文件操作涉及到两个类

1、nsfilemanager(用于文件的创建、复制、剪切、删除)

//------------------创建文件/文件夹
//获取沙盒目录
nsstring *homepath = nshomedirectory();
//在沙盒目录中创建一个文件file.text
nsstring *filepath = [homepath stringbyappendingpathcomponent:@"documents/file.text"];
//nsfilemanager是单利模式,所以不能使用alloc+init创建
nsfilemanager *manager = [nsfilemanager defaultmanager];
nsstring *str = @"无线互联";
nsdata *data = [str datausingencoding:nsutf8stringencoding];
//参数:文件路径、文件内容、文件的属性
bool sucess = [manager createfileatpath:filepath contents:data attributes:nil];
if(sucess){
nslog(@"文件创建成功");
}else{
nslog(@"文件创建失败");
}

//创建文件夹
nsstring *filepaths = [homepath stringbyappendingpathcomponent:@"documents/file"];
nserror *error;
//需要传递一个创建失败的指针对象,记录创建失败的信息
bool success1 = [manager createdirectoryatpath:filepaths withintermediatedirectories:yes attributes:nil error:&error];
if(!success1){
nslog(@"创建成功");
}else{
nslog(@"创建失败");
}

//--------------------读取文件
//根据路径读取文件内容
nsdata *datas = [manager contentsatpath:filepath];
nsstring *s = [[nsstring alloc] initwithdata:data encoding:nsutf8stringencoding];
nslog(@"%@",s);

//--------------------移动文件/剪切文件
//nsfilemanager中没有提供重命名的方法,所以我们可以借助移动的api进行操作
//把filepath移动到targetpath目录中
nsstring *targetpath = [homepath stringbyappendingpathcomponent:@"documents/file/file2.text"];
bool sucess2 = [manager moveitematpath:filepath topath:targetpath error:nil];
if(sucess2) {
nslog(@"移动成功");
}else{
nslog(@"移动失败");
}

//--------------------复制文件
bool sucess3 = [manager copyitematpath:filepath topath:targetpath error:nil];
if(sucess3){
//复制成功
}else{
//复制失败
}

//--------------------删除文件
//删除之前需要判断这个文件是否存在
bool isexist = [manager fileexistsatpath:filepath];//判断文件是否存在
if(isexist){
bool sucess4 = [manager removeitematpath:filepath error:nil];
if(sucess4){
//删除成功
}else{
//删除失败
}
}

//--------------------获取文件的属性
nsdictionary *dic = [manager attributesofitematpath:filepath error:nil];
nslog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key

2、nsfilehandle(对文件进行读写操作)

//1.-------------------字符串读写文件
nsstring *str = @"无线互联";
nsstring *homepath = nshomedirectory();
nsstring *filepath = [homepath stringbyappendingpathcomponent:@"documents/file.text"];
//现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败
//但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写
//成功,旧的文件也丢失了
//所以这时候atomically参数:
//yes:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了
bool sucess = [str writetofile:filepath atomically:yes encoding:nsutf8stringencoding error:nil];
if(sucess){
//写入成功
}else{
//写入失败
}
//读取文件内容到字符串中
//类方法
nsstring *str1 = [nsstring stringwithcontentsoffile:filepath encoding:nsutf8stringencoding error:nil];
//构造方法
//str1 = [[nsstring alloc] initwithcontentsoffile:filepath encoding:nsutf8stringencoding error:nil];
nslog(@"%@",str1);

//2.--------------------nsdata读写
//创建nsdata的同时读取文件中的内容
nsdata *data = [[nsdata alloc] initwithcontentsoffile:filepath];
//nsdata转化成nsstring
nsstring *s = [[nsstring alloc] initwithdata:data encoding:nsutf8stringencoding];
nslog(@"%@",s);

//写文件
bool sucess1 = [data writetofile:filepath atomically:yes];
if(sucess1){
//写入成功
}else{
//写入失败
}

 

//3.--------------------nsarray读写文件
nsarray *array = @[@"zhangsan",@"lisi"];
//属性文件一般后缀名为.plist
nsstring *filepaths = [homepath stringbyappendingpathcomponent:@"documents/array.plist"];
bool sucess2 = [array writetofile:filepaths atomically:yes];
if(sucess2){
//写入成功
}else{
//写入失败
}
//读文件
nsarray *arrays = [[nsarray alloc] initwithcontentsoffile:filepath];
nslog(@"%@",arrays);

//4.---------------------nsdictionary读写文件
nsdictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};
bool sucess3 = [dic writetofile:filepath atomically:yes];
if(sucess3){
//写入成功
}else{
//写入失败
}

//读文件
dic = [[nsdictionary alloc] initwithcontentsoffile:filepath];
nslog(@"%@",dic);

//追加数据
nsstring *str = @"无线互联";
nsstring *homepath = nshomedirectory();
nsstring *filepath = [homepath stringbyappendingpathcomponent:@"file.test"];
[str writetofile:filepath atomically:yes encoding:nsutf8stringencoding error:nil];//写入文件

nsfilehandle *handle = [nsfilehandle filehandleforwritingatpath:filepath];
//默认是从开始位置写,所以我们需要将写入游标设置到尾部
//从文件的末尾写入
[handle seektoendoffile];
nsstring *s = @"123";
nsdata *data = [s datausingencoding:nsutf8stringencoding];
[handle writedata:data];
//关闭文件
[handle closefile];

//读取文件
nsfilehandle *handles = [nsfilehandle filehandleforreadingatpath:filepath];

//获取文件的大小
nsfilemanager *filemanager = [nsfilemanager defaultmanager];
nsdictionary *fileattr = [filemanager attributesofitematpath:filepath error:nil];
nsnumber *filesize = [fileattr objectforkey:nsfilesize];
long long sizevalue = [filesize longlongvalue];

//设置偏移量
[handle seektofileoffset:sizevalue/2];//将偏移量设置到中间位置
//从当前偏移量读到文件末尾
nsdata *datas = [handle readdatatoendoffile];
nsstring *s2 = [[nsstring alloc] initwithdata:datas encoding:nsutf8stringencoding];
nslog(@"%@",s2);

//实现复制文件的功能
//使用nsfilehandle只能读写已经存在的文件,不能创建文件,创建文件应该使用nsfilemanager
nsstring *targetpath = [homepath stringbyappendingpathcomponent:@"files.test"];
nsfilemanager *filemanagers = [nsfilemanager defaultmanager];
[filemanagers createfileatpath:targetpath contents:nil attributes:nil];

//创建读取文件的handle
nsfilehandle *readhandles = [nsfilehandle filehandleforreadingatpath:filepath];
//创建写文件的handle
nsfilehandle *writehandles = [nsfilehandle filehandleforwritingatpath:targetpath];

//从当前偏移量读取到文件的末尾
nsdata *datass = [readhandles readdatatoendoffile];
//还有一种方式读取文件,既可以读取文件,也可以读流,功能更强
//[readhandles availabledata];
[writehandles writedata:datass];

//关闭文件
[readhandles closefile];
[writehandles closefile];

//这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段

 

原文:http://www.cnblogs.com/wangbaixue/p/5202078.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!