iOS的沙箱目录和文件操作
2018-01-30 14:18
302 查看
iOS的沙箱目录和文件操作
一、沙箱
iOS的每一个应用程序都有自己的目录来存放数据,这个目录称为沙箱目录。沙箱目录是一种数据安全策略,它设计的原理是只能允许自己的应用访问目录,而不允许其他的应用访问,这样可以保证数据的安全,应用之间是不能共享数据的。一些特有的应用(如通讯录)需要特定的API才能共享数据。
下面简单介绍一下,应用程序的沙箱目录,先直观的看一下演示程序的沙箱目录结构。
该应用程序的沙箱路径为:
/Users/"用户名"/Library/Developer/CoreSimulator/Devices/8DFE7883-956E-41E3-B099-18C92609E027/data/Containers/Data/Application/E82B708D-B06C-4837-BA59-74EE22CA7BE4
我们可以看到,该沙箱目录有三个子目录,分别为Documents,Library,tmp
1、[b]Documents[/b]
该目录用于存储非常大的文件或需要非常频繁更新的数据,能够进行iTunes或iCloud备份。该目录是只有一个元素的数组,因此获取该目录位置的代码如下:
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
2、Library
该目录下面有 Preferences和Caches两个子目录,[b]Preferences用于存放应用程序的设置数据,[b]能够进行iTunes或iCloud备份;Caches主要用来存放应用的缓存文件,iTunes不会备份。[/b][/b]
[b][b]获取Library目录位置的代码如下:[/b][/b]
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
获取Preferences目录位置的代码如下:
NSString *preferencePath = [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject];
获取Caches目录位置的代码如下:
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
3、tmp
该目录是用来存放临时文件的,它不能够进行iTunes或iCloud备份。用户可以访问它,获取该目录的代码如下:
NSString *tmpPath = NSTemporaryDirectory();
二、文件操作
1、创建文件夹我们在documents目录下创建test文件夹
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSLog(@"document文件夹路径为%@",documentPath); NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testPath = [documentPath stringByAppendingPathComponent:@"test"]; BOOL isSuccess = [fileManager createDirectoryAtPath:testPath withIntermediateDirectories:YES attributes:nil error:nil]; NSLog(@"成功创建文件夹了吗:%@",isSuccess?@"yes":@"no");
创建成功
2、创建文件
接着上面的代码,我们在test文件夹下创建文件test.txt
NSString *txtPath = [testPath stringByAppendingPathComponent:@"test.txt"]; BOOL isTxtSuccess = [fileManager createFileAtPath:txtPath contents:nil attributes:nil]; NSLog(@"成功创建文件了吗:%@",isTxtSuccess?@"yes":@"no");
创建成功
可以看到test.txt还是空的,下面我们写入数据。
3、写数据到文件
NSString *testString = @"Hello World?"; BOOL isWriteSuccess = [testString writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"成功写入数据了吗:%@",isWriteSuccess?@"yes":@"no");
写入成功
4、读取文件
下面我们读取我们刚刚创建的test.txt文件的内容
NSString *readString = [NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil]; NSLog(@"读取到的文件内容为%@",readString);
成功读取
5、删除文件
BOOL isDeleteSuccess = [fileManager removeItemAtPath:txtPath error:nil]; NSLog(@"成功删除文件了吗:%@",isDeleteSuccess?@"yes":@"no");
删除成功
6、计算路径下文件的总大小
+(float)sizeWithFilePath:(NSString *)path { NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL isDirectory = NO; /* 下面方法返回两个参数 isExist:该路径是否存在 isDirectory:该路径下是否是文件夹 */ BOOL isExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory]; if (!isExist) { return 0; } //如果是文件夹则遍历出文件 if (isDirectory) { //该方法能获得这个文件夹下面的所有子路径(直接/间接子路径) NSArray *subpaths = [fileManager subpathsAtPath:path]; float totalSize = 0; for (NSString *subpath in subpaths) { NSString *fullsubpath = [path stringByAppendingPathComponent:subpath]; //判断子路径下是否是文件夹 BOOL isDir = NO; [fileManager fileExistsAtPath:fullsubpath isDirectory:&isDir]; //子路径下是文件则计算大小 if (!isDir) { NSDictionary *attributes = [fileManager attributesOfItemAtPath:fullsubpath error:nil]; //得到的结果是以B为单位的,除以1024 * 1024 转换为MB totalSize += [attributes[NSFileSize] floatValue]; } } NSString *sizeString = [NSString stringWithFormat:@"%.2fMB",totalSize / (1024 * 1024.0)]; NSLog(@"路径%@下文件大小为%@",path,sizeString); return totalSize / (1024 * 1024.0); } else { NSDictionary *attributes = [fileManager attributesOfItemAtPath:path error:nil]; NSLog(@"路径%@下文件大小为%f",path,[attributes[NSFileSize] floatValue] / (1024 * 1024.0)); return [attributes[NSFileSize] floatValue] / (1024 * 1024.0); } }
7、删除路径下的所有文件
+(void)cleanFileWithFilePath:(NSString *)path { // NSLog(@"清除之前文件大小为%.2fMB",[FZYFileManager sizeWithFilePath:path]); NSFileManager *fileManager = [NSFileManager defaultManager]; dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(globalQueue, ^{ NSArray *subpaths = [fileManager subpathsAtPath:path]; for (NSString *subPath in subpaths) { NSError *error; NSString *fullPath = [path stringByAppendingPathComponent:subPath]; if ([fileManager fileExistsAtPath:fullPath]) { [fileManager removeItemAtPath:fullPath error:&error]; } } // NSLog(@"清除之后文件大小为%.2fMB",[FZYFileManager sizeWithFilePath:path]); dispatch_sync(dispatch_get_main_queue(), ^{ // [FZYFileManager cleanSuccess]; }); }); }
相关文章推荐
- IOS的一些文件操作。(沙箱) 在Documents目录下创建文件
- IOS的一些文件操作。(沙箱) 在Documents目录下创建文件
- IOS的一些文件操作。(沙箱) 在Documents目录下创建文件
- IOS的一些文件操作。(沙箱) 在Documents目录下创建文件
- [IOS]关于文件(文件目录)的读写操作
- iOS - 操作文件目录的方法
- 详解ios文件系统文件目录读写操作
- iOS - 操作文件目录的方法
- 关于IOS文件目录以及文件操作的学习
- IOS应用程序文件目录的操作
- ios 文件操作 检查文件是否存在 创建文件目录 iphone
- iOS 沙盒目录结构和文件操作(NSFileHandle)(三)
- unity 各平台下文件读写沙箱目录及ios审核(原)
- [绍棠] iOS文件目录和文件操作 及NSFileManager的读写操作
- iOS 文件目录操作
- iOS文件和目录操作,iOS文件操作,NSFileManager使用文件操作:
- iOS 沙盒目录结构和文件操作(NSFileManager)(一)
- iphone编程--详解ios文件系统文件目录读写操作
- iOS - 操作文件目录的方法
- iOS 沙盒目录结构和文件操作(NSFileManager)(二)