iOS为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的目录,不可以访问其他的目录,每个应用自己独自的访问空间被称为该应用的沙箱(sandBox):
1:Bundle container(这里通常存放的是应用创建时所携带的资源,即APP的程序文件)
2:Data container(用户使用应用时产生的资源和数据,即运行时产生的不同文件,Doucuments,Libary,Temp)
3:iCloud container(数据云同步)
一:iOS访问文件目录
系统函数:NSArray<NSString*>*NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)
- (void)showPathForDirectoriesInDomains{
NSLog(@"%@",[NSStringstringWithFormat:@"Applications:%@\nUsers:%@\nDocuments:%@\nLibary:%@\nLibary/Caches:%@\nLibary/Application Support:%@\n",
NSSearchPathForDirectoriesInDomains(NSApplicationDirectory,
NSUserDomainMask,YES),
NSSearchPathForDirectoriesInDomains(NSUserDirectory, NSUserDomainMask,YES),
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES),
NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,YES),
NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES),
NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask,YES)]);
}
函数说明:
NSSearchPathForDirectoriesInDomains()函数是一个C语言的函数,可以查找各种目录。
第一个常量NSApplicationDirectory(Applications目录)、NSUserDirectory(Users目录)、NSDocumentDirectory(Documents路径)等,表明正在查找的目录路径。
第二个常量NSUserDomainMask(应用的沙盒)表明我们限制的搜索范围。
二:NSFileManager操作
1:路径查询#pragma -mark - 路径查询
- (void)searchBtnClick{
NSLog(@"%@",[NSString stringWithFormat:@"浅搜索:%@",[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0].path error:nil]]);
}
2:创建文件
#pragma -mark - 创建文件
- (void)createfileBtnClick{
NSURL *baseUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
NSURL *fileUrl = [baseUrl URLByAppendingPathComponent:@"nancy.txt" isDirectory:true];
NSLog(@"fileUrl = %@",fileUrl);
if (![[NSFileManager defaultManager] fileExistsAtPath:fileUrl.path]) {
NSData *data = [@"创建文件时写入的数据" dataUsingEncoding:NSUTF8StringEncoding];
[[NSFileManager defaultManager] createFileAtPath:fileUrl.path contents:data attributes:nil];
NSLog(@"nancy.txt 创建成功");
}else{
NSLog(@"nancy.txt 已经存在");
}
}
3:创建文件夹
#pragma -mark - 创建文件夹
- (void)createFolderBtnClick{
NSURL *baseUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
NSURL *folderUrl = [baseUrl URLByAppendingPathComponent:@"nancy" isDirectory:true];
NSLog(@"folderUrl = %@",folderUrl);
if (![[NSFileManager defaultManager] fileExistsAtPath:folderUrl.path]) {
[[NSFileManager defaultManager] createDirectoryAtURL:folderUrl withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@"nancy 创建成功");
}else{
NSLog(@"nancy 已经存在");
}
}
4:删除文件
#pragma -mark - 删除文件
- (void)removeFileBtnClick{
NSURL *baseUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
NSURL *fileUrl = [baseUrl URLByAppendingPathComponent:@"nancy.txt" isDirectory:true];
if ([[NSFileManager defaultManager] fileExistsAtPath:fileUrl.path]) {
[[NSFileManager defaultManager] removeItemAtPath:fileUrl.path error:nil];
NSLog(@"nancy.txt文件删除成功");
}else{
NSLog(@"nancy.txt文件不存在,先创建文件");
}
}
5:删除文件夹
#pragma -mark - 删除文件夹
- (void)removeFolderBtnClick{
NSURL *baseUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
NSURL *folderUrl = [baseUrl URLByAppendingPathComponent:@"nancy" isDirectory:true];
if ([[NSFileManager defaultManager] fileExistsAtPath:folderUrl.path]) {
[[NSFileManager defaultManager] removeItemAtURL:folderUrl error:nil];
NSLog(@"nancy文件夹删除成功");
}else{
NSLog(@"nancy文件夹不存在");
}
三:NSFileHandel操作
1:文件数据读取
#pragma -mark - 文件数据读取
- (void)readBtnClick{
NSURL *baseUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
NSURL *fileUrl = [baseUrl URLByAppendingPathComponent:@"nancy.txt" isDirectory:true];
if ([[NSFileManager defaultManager] fileExistsAtPath:fileUrl.path]) {
NSFileHandle *fileHandel = [NSFileHandle fileHandleForReadingAtPath:fileUrl.path];
//设置距离文章开头的偏移量
[fileHandel seekToFileOffset:0];
NSData *data = [fileHandel readDataToEndOfFile];
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
self.fileHandelLabel.text = string;
}else{
self.fileHandelLabel.text = @"";
NSLog(@"nancy.txt文件不存在,先创建文件");
}
}
2:文件数据写入
#pragma -mark - 文件数据写入
- (void)writeBtnClick{
NSURL *baseUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
NSURL *fileUrl = [baseUrl URLByAppendingPathComponent:@"nancy.txt" isDirectory:true];
if ([[NSFileManager defaultManager] fileExistsAtPath:fileUrl.path]) {
NSString *string = @"添加一些文字到文件的末尾";
self.fileHandelLabel.text = string;
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSFileHandle *writeHandel = [NSFileHandle fileHandleForWritingToURL:fileUrl error:nil];
[writeHandel seekToEndOfFile];
[writeHandel writeData:data];
}else{
self.fileHandelLabel.text = @"";
NSLog(@"nancy.txt文件不存在,先创建文件"];
}
}
四:Bundle操作
iOS中提到的bundle,它存放的是应用可执行文件及相关资源文件。这个位置的所有文件在系统运行时只具有可读或者可执行的权限。
bundle中主要有以下几种类型的文件:
1:info plist(必须有的文件,用来配置应用的基本参数信息,包括版本号,指向可执行文件名,包名)
2:可执行文件(每个应用程序必须有一个可执行文件)
3:资源文件(可执行以外的文件,常用的如图像,图标,音频文件,视图文件,配置文件等)";
1:获取NSBundel的资源
#pragma -mark - NSBundle的资源
- (void)bundleResourceBtnClick{
NSURL *pathUrl = [[NSBundle mainBundle] URLForResource:@"AppIcon29x29@2x" withExtension:@"png"];
NSString *pathStr = [[NSBundle mainBundle] pathForResource:@"AppIcon60x60@3x" ofType:@"png"];
NSLog(@"%@",[NSString stringWithFormat:@"pathUrl = %@ \n pathStr = %@",pathUrl,pathStr]);
}
2:获取Bundel的信息
#pragma -mark - Bundle的信息
- (void)bundleInfoBtnClick{
NSLog(@"infoPlist: %@",[[NSBundle mainBundle] infoDictionary]);
NSBundle *mainBundle = [NSBundle mainBundle];
NSLog(@"%@",[NSString stringWithFormat:@"BundleID(应用程序唯一标识): %@\n BundleVerson(应用编译版本号): %@ \n BundleName(应用的Bundel名): %@ \n BundleExecutable(应用可执行程序的名称): %@ \n MinimumOSVersion(最低系统): %@",mainBundle.bundleIdentifier,[mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"],[mainBundle objectForInfoDictionaryKey:@"CFBundleName"],[mainBundle objectForInfoDictionaryKey:@"CFBundleExecutable"],[mainBundle objectForInfoDictionaryKey:@"MinimumOSVersion"]]);
}