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

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

作者: baiwulong | 来源:发表于2018-03-27 11:37 被阅读32次

.
.

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开发-文件操作

相关文章

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

    .. 1、沙盒 每一个APP都有一个存储空间,就是沙盒。APP之间不能相互通信。iOS 沙盒机制简介沙盒也叫沙箱,...

  • iOS 的沙盒路径&文件操作

    每个iOS 应用都有自己的沙盒路径,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,iOS应用不允许访问其他应...

  • iOS沙盒解析及操作

    介绍 概念:每个应用拥有自己的应用沙盒,所谓的应用沙盒就是文件系统目录。 沙盒文件目录 沙盒操作 获取应用根目录 ...

  • 沙盒存储操作

    // 沙盒存储操作 /**每个iOS程序都有自己的文件系统目录,就是沙盒,并且与其他文件系统、其他应用程序隔离,并...

  • iOS开发-隐私权限

    背景 iOS的安全机制——沙盒限制了应用程序执行各种操作的权限。沙盒实际就是程序的系统文件目录,非代码文件都在此保...

  • iOS-沙盒详尽

    write主要用于往磁盘目录下写入文件。本篇借write操作也详尽整理一下设备的沙盒目录记忆沙盒目录的操作方法。沙...

  • 网页设计 - 收藏集 - 掘金

    免费且又精致的 HTML/CSS 站点模板 - 前端 - 掘金&amp;amp;amp;amp;amp;l...

  • iOS开发之沙盒机制&文件操作(NSFielManage

    沙盒机制 iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒。每一个APP都是一个信息孤岛...

  • NSFileManager操作小结

    16/08/04/wed NSFileManager操作小结: ① 直接在沙盒目录下添加文件: 此种情况下,沙盒...

  • iOS 文件操作

    iOS文件(沙盒目录,文件创建、移动、复制等) 目录获取获取沙盒的主目录路径: (NSString *)homeD...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/kbsjcftx.html