iOS文件管理
来源:互联网 发布:美国研究生预科 知乎 编辑:程序博客网 时间:2024/05/21 17:48
IOS中的沙盒机制(SandBox)是一种安全体系,
它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。
所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
1.每个应用程序都在自己的沙盒内
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
3.应用程序向外请求或接收数据都需要经过权限认证
沙盒中内容
一个应用程序包: xxx.app
三个文件夹
Documents: 程序应用过程创建的文件/设置/小文件(iTunes会备份/iCloud会备份)
Library: 使用过程中从网络中下载的图片/音频/视频文件 (iTunes不会备份/iCloud不会备份)
tmp: 临时文件夹(系统会定时不定时的清除下面所有的文件)
获取沙盒根目录
NSString *homeDirectory =NSHomeDirectory();
获取沙盒中的Documents目录
/**第一个参数:制定要搜索的文件夹
第二个参数:制定域(登录用户)
第三个参数:YES(绝对路径);NO(~/xxx/xxx)
*/
//获取数据中的唯一对象
NSString *documentStr =
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)firstObject];
获取沙盒中的Library目录
NSString *libraryStr =
[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
获取沙盒中的Library/Caches目录(下载图片)
NSString *cachesStr =
[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
获取沙盒中的tmp目录
NSString *tmpStr =NSTemporaryDirectory();
使用writeToFile方法,将NSString对象写入文件
/*
第二个参数:YES(默认在中间的过程中创建辅助文件,等待辅助文件中的内容写成功,然后写入test.txt);NO(没有辅助文件)
第三参数:制定编码方式 UTF-8
执行两个动作:1)判定test.txt是否存在,如果不存在,会自动地创建;2)如果存在,会将contentStr写入文件中,覆盖原来的内容
*/
NSError *error = nil;
BOOL isSuccess =
[contentStr writeToFile:filePathatomically:YESencoding:NSUTF8StringEncodingerror:&error];
if (!isSuccess) {
NSLog(@"写入字符串失败:%@",error.userInfo);
}
将NSArray对象写入文件
[array writeToFile:filePathatomically:YES];
初始化文件管理对象
self.fileMgr = [NSFileManager defaultManager]; //单例对象
创建文件夹
/*
第二个参数:yes(允许test文件已经存在,不再创建); no(不允许test文件夹存在;如果存在test文件夹,就会报错)
第三个参数:制定文件的参数(文件夹的所有者/文件夹的权限rw); nil(使用默认的权限)
*/
NSError *error = nil;
[self.fileMgr createDirectoryAtPath:self.testDirectoryPathwithIntermediateDirectories:YESattributes:nilerror:&error];
创建文件,将NSString对象写入文件
BOOL isSuccess =
[self.fileMgr createFileAtPath:firstTestPathcontents:[firstStrdataUsingEncoding:NSUTF8StringEncoding]attributes:nil];
获取文件夹下的所有文件
方式一:
NSError *error = nil;
NSArray *filesArray =
[self.fileMgr subpathsOfDirectoryAtPath:self.testDirectoryPatherror:&error];
if (!error) {
for (NSString *fileStr in filesArray) {
NSLog(@"file string:%@",fileStr);
}
}
方式二:使用迭代器的方法获取test文件夹下的所有文件路径
NSDirectoryEnumerator *enumeator = [self.fileMgrenumeratorAtPath:self.testDirectoryPath];
NSString *obj;
while (obj = [ enumeatornextObject]) {
NSLog(@"文件的名字:%@", obj);
}
拷贝文件
/*
1.首先判定targetFile是否存在,不存在,自动地创建;
2.拷贝内容
*/
NSError *error = nil;
BOOL isSuccess =
[self.fileMgr copyItemAtPath:souceFiletoPath:targetFileerror:&error];
删除文件
NSError *error = nil;
BOOL isSuccess =
[self.fileMgr removeItemAtPath:testStrerror:&error];
查看Bundle容器文件路径
Bundle简单地讲,就是一个内部结构按照标准规则组织的特殊目录。
//SandBox: Bundle容器(xxx.app)
NSString *pngStr =
[[NSBundle mainBundle]pathForResource:@"test"ofType:@"png”];//test.png
使用NSFileHandle拷贝小文件
//创建两个文件句柄的对象;源文件是读句柄,目标文件是写句柄
NSFileHandle *readFileHandle = [NSFileHandlefileHandleForReadingAtPath:sourcePath];
NSFileHandle *writeFileHandle = [NSFileHandlefileHandleForWritingAtPath:targetPath];
//使用读句柄把源文件的内容读出来
NSData *readData = [readFileHandlereadDataToEndOfFile];
//使用写句柄将读出来的内容写入目标文件
[writeFileHandlewriteData:readData];
//关闭两个句柄对象
[readFileHandle closeFile];
[writeFileHandle closeFile];
使用NSFileHandle拷贝大文件
//Documents/BigFile.pdf -> /Documents/BigFileBak.pdf
NSString *sourcePath = [self.documentPath stringByAppendingPathComponent:@"Xcode_Overview.pdf"];
NSString *targetPath = [self.documentPath stringByAppendingPathComponent:@"Xcode_Overview.bak”];//.bak文件是备份文件
//创建一个空的目标文件BigFileBak.pdf
[self.fileMgr createFileAtPath:targetPath contents:nil attributes:nil])
//创建两个句柄(读/写)
NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:sourcePath];
NSFileHandle *writeHandle = [NSFileHandle fileHandleForWritingAtPath:targetPath];
//循环从原文件中读取一部分数据(5000bytes),读一部分写入目标文件中
//每次读取源文件5000bytes大小
NSInteger sizePerTime = 5000;
//目前为止读取源文件的数据大小
NSInteger readSize = 0;
源文件的总大小(方式一)
unsigned long long totalFileSize = [readHandleseekToEndOfFile];
//将移动到最后的读句柄对象挪动到文件最开始位置
[readHandle seekToFileOffset:0];
源文件的总大小(方式二:通过fileMgr对象获取源文件属性)
NSDictionary *fileDic = [self.fileMgrattributesOfItemAtPath:sourcePatherror:nil];
NSNumber *fileSize = [fileDicobjectForKey:NSFileSize];
unsigned long long totalFileSize = [fileSize longLongValue];
//判定while循环的条件
BOOL isEnd = YES;
while (isEnd) {
//剩下的还没有读取的数据大小
NSInteger leftSize = totalFileSize - readSize;
NSData *data = nil;
if (leftSize < sizePerTime) {
//情况一:不足5000bytes
data = [readHandle readDataToEndOfFile];
isEnd = NO;
} else {
//情况二:每次读取5000bytes
data = [readHandlereadDataOfLength:sizePerTime];
//累加每次读取的数据的大小
readSize += sizePerTime;
//挪动指针(偏移量每次都从文件的开始挪动)
[readHandle seekToFileOffset:readSize];
}
//写入目标文件
[writeHandle writeData:data];
}
//关闭两个句柄对象
[readHandle closeFile];
[writeHandle closeFile];
- iOS开发-文件管理
- iOS开发-文件管理
- 笔记-IOS 文件管理
- iOS文件管理
- IOS文件管理
- ios开发----文件管理
- iOS开发-文件管理
- iOS开发-文件管理
- iOS开发-文件管理
- IOS-文件管理NSFileManager
- iOS文件管理
- iOS开发-文件管理
- iOS 文件管理
- iOS中的文件管理
- iOS开发-文件管理
- iOS开发-文件管理
- iOS开发-文件管理
- iOS开发-文件管理
- UIWebView
- 方差/标准差/四分位数/z-score公式
- SCWCD(二)
- 框架搭建-SSI搭建步骤详解
- C++ 用cout输出小数点后位数的方法
- iOS文件管理
- 数据库范式——通俗易懂
- [MFC]DriveTree应用:CTreeView的示例
- PopupWindow用法
- 我们帮助 iOS 平台的 App快速进入审核状态,跳过漫长的两到三周的等待时间
- 0009Ogre实现起伏定型,云雾效果
- Android PopupWindow 的使用
- Android中PopupWindow的用法(位置、动画、焦点)
- Xcode7 上传AppStore出现 ERROR ITMS-90474,ERROR ITMS-90475错误