iOS沙盒与文件管理

来源:互联网 发布:电脑绘画 知乎 编辑:程序博客网 时间:2024/06/05 04:06

本文整理自苹果官方文档:
https://developer.apple.com/library/prerelease/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010672-CH1-SW1
1、“Every App Is an Island”,iOS APP与文件系统的交互被限制在“沙盒”(sandbox)之内。APP在安装的时候,就在沙盒中创建了一系列的容器(container).
这里写图片描述
iOS APP的文件操作被限制在沙盒与容器中。例外是APP使用公开的系统接口来访问联系人、音乐这样的公共资源。这种情况下,系统框架来处理文件相关的操作。
2、出于安全的考虑,iOS APP的数据只能写在规定的位置。常见的位置如下:
AppName.app: 包含APP及其所有资源。不可写。不被iTunes备份。
Documents/:包含用户生成的数据。可读写。会被iTunes备份。
Documents/Inbox:可被外部程序访问的文件。APP可读、可删除,但不能创建和修改。会被iTunes备份。
Library/:所有非用户数据文件的根目录。会被iTunes备份。
tmp/:存储零时数据。你的APP应当在不需要的时候,清除这些零时数据。系统也可能在你的APP没有运行的时候,清除这些零时数据。不被iTunes备份。
3、APP数据存储指南
将用户数据保存在Documents目录下。
将APP创建的支持文件保存在Library目录的下Application support子目录下。
Documents目录和.Application support目录默认都会被备份。但可以调用-[NSURL setResourceValue:forKey:error:] 方法,指定 NSURLIsExcludedFromBackupKey关键字来排除体积过大的文件,如媒体文件。
将临时数据存储在 tmp/目录下.
将缓存数据存放在Library/Caches/目录下。

4、文件及目录路径的表示
推荐使用NSURL对象来表示。
也可以使用NSString或CFURLRef。

Path-based URL: file://localhost/Users/steve/Documents/MyFile.txt
File reference URL: file:///.file/id=6571367.2773272/
String-based path: /Users/steve/Documents/MyFile.txt

系统重启后,文件ID可能会发生改变。
可以使用NSURL的absoluteString方法,将Path-based URL转换为String-based path。
NSURL和NSString都有一些路径相关的操作,可以根据需要选择使用。

4、app包中资源的路径
可以使用NSBundle对象,来定位APP包中的资源文件。例如:

NSURL* url = [[NSBundle mainBundle] URLForResource:@"MyImage" withExtension:@"png"];

5、标准目录下的项目定位

//  NSFileManager的方法(推荐使用)- (NSArray<NSURL *> *)URLsForDirectory :(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask;例如:NSArray *arr;NSURL *documentsUrl;arr = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];documentsUrl =  arr[0];
// 该方法与 URLsForDirectory:inDomains:方法类似,不过它取得的是String-based pathNSArray<NSString *> * NSSearchPathForDirectoriesInDomains ( NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde );
NSHomeDirectory方法,返回用户或APP的根目录。
NSTemporaryDirectory(),返回临时目录temp/.

6、目录遍历
NSDirectoryEnumerator 类定义了检索文件的方法,但是它本身是一个抽象类,不能直接创建其实例。NSFi leManager中有两个方法:

- (nullable NSDirectoryEnumerator<NSString *> *)enumeratorAtPath:(NSString *)path;
- (nullable NSDirectoryEnumerator<NSURL *> *)enumeratorAtURL:(NSURL *)url includingPropertiesForKeys:(nullable NSArray<NSString *> *)keys options:(NSDirectoryEnumerationOptions)mask errorHandler:(nullable BOOL (^)(NSURL *url, NSError *error))handler

可以得到NSDirectoryEnumerator一个具体的实例。
遍历目录是递归的。你可以调用遍历对象的skipDescendents方法跳过你不感兴趣的目录。

例子:

NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:NSHomeDirectory()];for (NSString *str in enumerator.allObjects) {    NSLog(@"\n%@",str);}

执行结果:(相对沙盒主目录的相对路径、递归)
2016-08-19 18:11:45.668 FileManagerDemo[1764:217580]
.com.apple.mobile_container_manager.metadata.plist
2016-08-19 18:11:45.670 FileManagerDemo[1764:217580]
Documents
2016-08-19 18:11:45.670 FileManagerDemo[1764:217580]
Library
2016-08-19 18:11:45.670 FileManagerDemo[1764:217580]
Library/Caches
2016-08-19 18:11:45.670 FileManagerDemo[1764:217580]
Library/Caches/Snapshots
2016-08-19 18:11:45.671 FileManagerDemo[1764:217580]
Library/Caches/Snapshots/ycan.FileManagerDemo
2016-08-19 18:11:45.671 FileManagerDemo[1764:217580]
Library/Caches/Snapshots/ycan.FileManagerDemo/1B5E282A-F6BE-4642-93E1-4E5E665E5F3E@2x.png
2016-08-19 18:11:45.671 FileManagerDemo[1764:217580]
Library/Caches/Snapshots/ycan.FileManagerDemo/6E06A16B-B1E1-4350-BEBF-E148D97865A5@2x.png
2016-08-19 18:11:45.671 FileManagerDemo[1764:217580]
Library/Preferences
2016-08-19 18:11:45.671 FileManagerDemo[1764:217580]
tmp

例子:

NSDirectoryEnumerator<NSURL*> *enumerator = [[NSFileManager defaultManager] enumeratorAtURL:[NSURL URLWithString:NSHomeDirectory()] includingPropertiesForKeys:nil options:0 errorHandler:nil];for (NSURL *url in enumerator.allObjects) {   NSLog(@"\n%@",url);}

执行结果:(绝对路径,递归)
2016-08-19 18:20:17.275 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/.com.apple.mobile_container_manager.metadata.plist
2016-08-19 18:20:17.275 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Documents/
2016-08-19 18:20:17.276 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/
2016-08-19 18:20:17.279 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/Caches/
2016-08-19 18:20:17.279 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/Caches/Snapshots/
2016-08-19 18:20:17.279 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/Caches/Snapshots/ycan.FileManagerDemo/
2016-08-19 18:20:17.279 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/Caches/Snapshots/ycan.FileManagerDemo/335B09CF-BF04-47DB-941E-25AA76E8C597@2x.png
2016-08-19 18:20:17.308 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/Caches/Snapshots/ycan.FileManagerDemo/935F14FC-B28C-4F7A-9EA8-5705D8AEB708@2x.png
2016-08-19 18:20:17.308 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/Library/Preferences/
2016-08-19 18:20:17.308 FileManagerDemo[1791:223369]
file:///Users/fww/Library/Developer/CoreSimulator/Devices/3F378932-3D1D-497A-A862-C41386D90B11/data/Containers/Data/Application/04FA0099-DD6F-4AFA-9B67-C4FDE36CF486/tmp/

还有一个方式,我自己用的比较多的:

NSArray *arr;arr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:NSHomeDirectory() error:nil];for (NSString *str in arr) {    NSLog(@"\n%@",str);}

执行结果:(仅目录或文件名、不递归)
2016-08-19 18:29:47.993 FileManagerDemo[1805:228467]
.com.apple.mobile_container_manager.metadata.plist
2016-08-19 18:29:47.993 FileManagerDemo[1805:228467]
Documents
2016-08-19 18:29:47.994 FileManagerDemo[1805:228467]
Library
2016-08-19 18:29:47.994 FileManagerDemo[1805:228467]
tmp

0 0
原创粉丝点击