.
.
1、沙盒
每一个APP都有一个存储空间,就是沙盒。APP之间不能相互通信。
iOS 沙盒机制简介
沙盒也叫沙箱,英文standbox,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。在沙盒机制下,每个程序之间的文件夹不能互相访问。iOS系统为了保证系统安全,采用了这种机制。
iOS 应用程序在安装时,会创建属于自己的沙盒文件,应用程序不能直接访问其他应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。
应用程序中所有的非代码文件都保存在沙盒中,比如图片、声音、属性列表,sqlite数据库和文本文件等。
下面是一个沙盒目录截图:
屏幕快照 2018-03-27 上午10.34.20.png
目录文件介绍
(1)沙盒路径:APP的私有存储空间。
NSString*homeDir = NSHomeDirectory(); //输出的是沙盒的路径,里面包括Documents,Library等子目录。
(2)Documents目录:此文件夹是默认备份的,备份到iCloud。
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
/*
此文件夹是默认备份的,备份到iCloud
注:iCloud的备份,会通过Wi-Fi每天自动备份用户iOS设备。
1.app的home目录下的所有东西都会被备份,除了应用Bundle本身、缓存目录和temp目录。
2.已购买的音乐、应用、书籍、Camera Roll、设备设置、主屏幕、App组织、消息、铃声也都会被备份。
3.由于备份通过无线进行,并且为每个用户存储在iCloud中,应用需最小化自己存储的数据数量。
4.大文件会延长备份时间,并且消耗用户的可用iCloud空间。
*/
(3)Library目录
// 获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
(3-1)获取Library - Caches
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
/*
缓存数据
可以重新下载或生成的数据,而且没有这些数据也不会妨碍用户离线使用应用的功能。
缓存数据应该保存在/Library/Caches目录下。
缓存数据在设备低存储空间时可能会被删除,iTunes或iCloud不会对其进行备份。
系统的缓存都放在这个文件夹下面(主要是网路).
当访问网络时系统自动会把访问的url,以数据库的方式存放在此目录下面.
*/
(3-2)获取Library - Preferences(默认备份的)
// 获取Preferences目录路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *preferences = [[paths firstObject] stringByAppendingString:@"/Preferences"];
/*
NSUserDefaults就是默认存放在此文件夹
*/
(4)获取tmp目录:临时文件夹(系统会不定期删除里面的文件)
NSString *tmpDir = NSTemporaryDirectory();// 获取tmp目录路径
/*
应用需要写到本地存储,内部使用的临时数据,但不需要长期保留使用。
临时数据应该保存在/tmp目录。
系统可能会清空该目录下的数据,iTunes或iCloud也不会对其进行备份。
应用在不需要使用这些数据时,应该尽快地删除临时数据,以避免浪费用户的存储空间。
*/
.
.
2、文件操作相关
2-1、 NSString类路径处理
举例:NSString *path = @"/Uesrs/apple/testfile.txt"
各个路径组成部分 : ("/","User","apple","testfile.txt")
-(NSArray *)pathComponents;
最后一个组成部分 : testfile.txt
-(NSString *)lastPathComponent;
删除最后一部分的组成路径 : /Users/apple
-(NSString *)stringByDeletingLastPathCpmponent;
将path添加到前面路径的末尾 : /Users/apple/testfile.txt/app.txt
-(NSString *)stringByAppendingPathConmponent:(NSString *)path;
取路径最后部分的扩展名 : txt
-(NSString *)pathExtension;
删除扩展名的部分路径 : /Users/apple/testfile
-(NSString *)stringByDeletingPathExtension;
路径最后部分追加扩展名 : /User/apple/testfile.txt.jpg
-(NSString *)stringByAppendingPathExtension:(NSString *)str;
2-2、文件管理
NSFileManager * fileManager = [NSFileManager defaultManager]; //文件管理操作类
遍历目录:浅度遍历 & 深度遍历
//浅度遍历
NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
//深度遍历
array = [fileManger subpathsOfDirectoryAtPath:path error:nil];
判断文件是否存在
BOOL isExist = [ [NSFileManager defaultManager] fileExistsAtPath:path];
创建文件和目录
/*
创建文件
注意:如果文件已经存在会覆盖
createFileAtPath:要创建文件的路径
contents:文件内容(NSData类型)
attributes:文件属性,一般为nil,nil表示采用默认属性。
*/
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
/*
创建目录
createDirectoryAtPath:如果文件夹已经存在不会覆盖
withIntermediateDirectories:是否有中间目录
attributes:文件夹的属性,nil表示默认属性
error:错误信息
*/
BOOL createOK = [ [NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
拷贝文件/目录
//目录与目录拷贝
[ [NSFileManager defaultManager] copyItemAtPath:fromFilePath toPath:toDirPath error:&error];
//文件与文件拷贝
[ [NSFileManager defaultManager] copyItemAtPath:fromFilePath toPath:toFilePath error:&error];
移动文件/目录
[[NSFileManager defaultManager] moveItemAtPath:frompath toPath:toPath error:nil];
删除文件/目录
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
获取文件属性
NSDictionary *attributes = [fileManger attributesOfItemAtPath:path error:nil];
NSLog(@"文件的属性:%@",attributes);
.
.
2-3、NSFileHandle(文件句柄类)
<1>打开文件方法
//只读的句柄
NSFileHandle *readOnlyHandle = [NSFileHandle fileHandleForReadingAtPath:path];
//只写的句柄
NSFileHandle *writeOnlyHandle = [NSFileHandle fileHandleForWritingAtPath:path];
//读写句柄
NSFileHandle *readAndWriteHandle = [NSFileHandle fileHandleForUpdatingAtPath:path];
<2>读指定长度的数据(单位为字节)
//读取5个字节数据
NSData *data = [readOnlyHandle readDataOfLength:5];
<3>从当前偏移量读到文件尾
[readOnlyHandle readDataToEndOfFile]
[readAndWriteHandle readDataToEndOfFile]
<4>设置文件偏移量(单位为字节)
[readOnlyHandle seekToFileOffset:偏移的字节数];
<5>将文件偏移量定位到文件尾
[readOnlyHandle seekToEndOfFile];
<6>写文件(不覆盖的时候需要设置偏移量)
//1.先把偏移量指到文件尾部
[readAndWriteHandle seekToEndOfFile];
//2.写入到指定路径
[readAndWriteHandle writeData:[@"abcdef" dataUsingEncoding:NSUTF8StringEncoding]];
<7>关闭文件句柄
//关闭文件句柄,关闭后(不需要)就不能再操作文件了
[readAndWriteHandle closeFile];
[readOnlyHandle closeFile];
[writeOnlyHandle closeFile];
参考文章:
网友评论