iOS 中级篇 - 《沙盒&目录操作&文件操作》

.
.

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];

参考文章:

iOS之沙盒路径
iOS开发-文件操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354