前言:
之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了。文件沙盒存储主要存储非机密数据,大的数据。
接下来具体认识一下沙盒存储:
每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许访问其他应用的应用沙盒。在ios8中已经开放访问。
应用沙盒一般包括以下几个文件目录:应用程序包、Documents、Libaray(下面有Caches和Preferences目录)、tmp。
应用程序包:包含所有的资源文件和可执行文件。
Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录。iphone重启时,该目录下的文件会丢失。
Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。
Libaray/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一般存放体积比较大,不是特别重要的资源。
Libaray/Preferences:保存应用的所有偏好设置,ios的Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。
具体获取各个目录代码如下:
// 获得应用程序沙盒的Documents文件夹路径 NSArray *arrDocumentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentPath=[arrDocumentPaths objectAtIndex:0]; NSLog(@"Documents path: %@",documentPath); // 获得应用程序沙盒的Caches文件夹路径 NSArray *arrCachesPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES); NSString *CachesPath=[arrCachesPaths objectAtIndex:0]; NSLog(@"Caches path: %@",CachesPath); // 获得应用程序沙盒的Downloads文件夹路径 NSArray *arrDownloadPaths=NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory,NSUserDomainMask,YES); NSString *loadPathsPath=[arrDownloadPaths objectAtIndex:0]; NSLog(@"Downloads path: %@",loadPathsPath); // 获得应用程序沙盒的home文件夹路径 NSString *homePath= NSHomeDirectory(); // 获得应用程序沙盒的tmp文件夹路径 NSString *TmpPath= NSTemporaryDirectory();
为了方便使用整理一个File工具类:
FileUtils.h
#import <Foundation/Foundation.h> @interface FileUtils : NSObject //返回缓存根目录 "caches" +(NSString *)getCachesDirectory; //返回根目录路径 "document" + (NSString *)getDocumentPath; //创建文件夹 +(BOOL)creatDir:(NSString*)dirPath; //删除文件夹 +(BOOL)deleteDir:(NSString*)dirPath; //移动文件夹 +(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath; //创建文件 + (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data; //读取文件 +(NSData*)readFile:(NSString *)filePath; //删除文件 +(BOOL)deleteFile:(NSString *)filePath; //返回 文件全路径 + (NSString*)getFilePath:(NSString*) fileName; //在对应文件保存数据 + (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data; //从对应的文件读取数据 + (NSData*)readDataFromFile:(NSString*)fileName; @end
FileUtils.m
#import "FileUtils.h" @implementation FileUtils //返回缓存根目录 "caches" +(NSString *)getCachesDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *caches = [paths firstObject]; return caches; } //返回根目录路径 "document" + (NSString *)getDocumentPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [paths firstObject]; return documentPath; } //创建文件目录 +(BOOL)creatDir:(NSString*)dirPath { if ([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//判断dirPath路径文件夹是否已存在,此处dirPath为需要新建的文件夹的绝对路径 { return NO; } else { [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];//创建文件夹 return YES; } } //删除文件目录 +(BOOL)deleteDir:(NSString*)dirPath { if([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//如果存在临时文件的配置文件 { NSError *error=nil; return [[NSFileManager defaultManager] removeItemAtPath:dirPath error:&error]; } return NO; } //移动文件夹 +(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath; { NSError *error=nil; if([[NSFileManager defaultManager] moveItemAtPath:srcPath toPath:desPath error:&error]!=YES)// prePath 为原路径、 cenPath 为目标路径 { NSLog(@"移动文件失败"); return NO; } else { NSLog(@"移动文件成功"); return YES; } } //创建文件 + (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data { return [[NSFileManager defaultManager] createFileAtPath:filePath contents:data attributes:nil]; } //读取文件 +(NSData*)readFile:(NSString *)filePath { return [NSData dataWithContentsOfFile:filePath options:0 error:NULL]; } //删除文件 +(BOOL)deleteFile:(NSString *)filePath { return [self deleteDir:filePath]; } + (NSString *)getFilePath:(NSString *)fileName { NSString *dirPath = [[self getDocumentPath] stringByAppendingPathComponent:fileName]; return dirPath; } + (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data { NSString *filePath=[self getFilePath:fileName]; return [self creatFile:filePath withData:data]; } + (NSData*)readDataFromFile:(NSString*)fileName { NSString *filePath=[self getFilePath:fileName]; return [self readFile:filePath]; } @end