【IOS学习基础】文件相关
一、沙盒(SandBox)
1.沙盒机制
1> 每个应用都有属于自己的存储空间,即沙盒。
2> 应用只能访问自己的沙盒,不可访问其他区域。
3> 如果应用需要进行文件操作,则必须将文件存放在沙盒中,尤其是数据库文件,在电脑上操作时,可以去访问,但是如果要装在真机上可以使用,必须将数据库文件拷贝至沙盒中。
2.沙盒目录结构
1> Documents:在应用中建立的文件,如数据库等可以放在这里,iTunes备份和恢复的时候会包括此目录。
2> tmp:存放及时传送的临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除。
3> Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。
4> Library/Preferences:应用程序偏好设置,我们经常使用的NSUserDefault就保存在该目录下的一个Plist文件中,iTnues还会同步此文件。
3.关于几个参数
NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde); directory
NSSearchPathDirectory类型的enum值,表明我们要搜索的目录名称(NSDocumentDirectory、NSCachesDirectory。 domainMask
NSSearchPathDomainMask类型的enum值,指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。 expandTilde
BOOL值,表示是否展开波浪线~。我们知道在iOS中~的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”。
4.沙盒路径的获取
#pragma mark 沙盒主路径
-(NSString *)homePath
{
return NSHomeDirectory();
} #pragma mark 用户应用数据路径
+(NSString *)getDocuments
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path = [paths objectAtIndex:];
return path;
} #pragma mark 缓存数据路径
+(NSString *)getCache
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
return paths[];
} #pragma mark 临时文件路径
+(NSString *)getTemp
{
return NSTemporaryDirectory();
} #pragma mark Library路径
+(NSString *)getLibrary
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *path = [paths objectAtIndex:];
return path;
} 开发中经常会打印沙盒的路径,除了用NSLog输出之外,还可以这样(注意,要打断点调试)

二、NSBundle
1.NSBundle *mainBundle = [NSBundle mainBundle];
bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle.我们的程序是一个bundle. 在Finder中,一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录. 我们把这个目录叫做程序的main bundle。
NSLog(@"获取app包路径:%@",mainBundle.bundlePath); NSLog(@"获取app资源目录路径:%@",mainBundle.resourcePath); NSLog(@"应用标识bundle Identifier:%@",mainBundle.bundleIdentifier); NSLog(@"info.plist信息及其他:%@",mainBundle.infoDictionary); 提示:关于打印字典或数组中文乱码的问题,请自行搜索NSDitionary/NSArray + Log分类或重写他们的-(NSString *)descriptionWithLocale:(id)locale方法。
2.Bundle的使用
1> 新建Bundle:既然Bundle就是一个目录,那不妨新建一个文件夹,在其中放入我们需要的资源素材,然后对文件夹进行重名“文件名.bundle”,之后会弹出提示框(如下图),点击“添加”。2> 读取自己的Bundle资源(以百度SDK为例)
百度地图的IphoneMapSdkDemo示例程序中有一个名为”mapapi.bundle"的图片资源包而在其demo的“AnnotationDemoViewController.m"文件中,定义了这么几个宏
// 资源包文件名
#define MYBUNDLE_NAME @ "mapapi.bundle"
// 拼接mapapi.bundle资源包路径
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
// 获取mapapi.bundle资源包
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]
// 加载资源包中规定某个文件
[[NSBundle mainBundle] pathForResource:@"XXX.png(想要获取的文件名)" ofType:nil inDirectory:@"mapapi.bundle"];
// 加载xib文件
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil];
三、NSFileManager文件管理类
1.NSFileManager主要用于对目录、文件的基本操作,且其是一个单例对象(单例模式:一种设计模式,即一个类永远只有一个类对象),使用时NSFileManager *fm = [NSFileManager defaultManager]。
2.宏定义快速实现单例(前几天在网上看到的,觉得挺好的,记录一下)
1> 新建一个”Singleton.h"文件,在里面粘贴如下代码
// .h
#define singleton_interface(class) + (instancetype)shared##class; // .m
#define singleton_implementation(class) \
static class *_instance; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
\
return _instance; \
} \
\
+ (instancetype)shared##class \
{ \
if (_instance == nil) { \
_instance = [[class alloc] init]; \
} \
\
return _instance; \
}
2> 新建一个类,分别在.h文件和.m文件里面写上如下图代码,
 
3> 使用:SingerTest *test = [SingerTest sharedSingerTest];
  3.方法搜集
| 
 NSString *NSUserName(void);  | 
返回当前登录的用户名 | 
| 
 NSString *NSFullUserName(void);  | 
返回当前用户的完整用户名 | 
| 
 NSString *NSHomeDirectory(void);  | 
返回当前主目录的路径(常用) | 
| 
 NSString * __nullable NSHomeDirectoryForUser(NSString * __nullable userName);  | 
返回指定用户名的主目录 | 
| 
 NSString *NSTemporaryDirectory(void);  | 
返回用于创建临时文件夹的目录路径 | 
| 
 NSString *NSOpenStepRootDirectory(void);  | 
返回当前用户的系统根目录 | 
| 
 - (BOOL)fileExistsAtPath:(NSString *)path;  | 
判断path下是否存在文件/文件夹 | 
| 
 - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(nullable BOOL *)isDirectory;  | 
判断path下是否是文件 | 
| - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary<NSString *, id> *)attributes error:(NSError **)error | 
 新建文件夹 参数: 1-文件夹路径。 2-YES为如果文件不存在,则创建;NO,文件夹不创建。 3-文件夹的属性,可读可写,一般传nil。 4-错误信息 。  | 
| - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error | 移除文件/文件夹 | 
| - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error | 复制文件/文件夹 | 
| - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error | 移动文件/文件夹 | 
| 
 - (BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData *)data attributes:(nullable NSDictionary<NSString *, id> *)att  | 
 新建文件 参数: 1-文件路径(最后面拼接文件名) 2-需要新建的文件数据 3-属性  | 
| 
 - (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2;  | 
比较两个path下的文件是否相同 | 
| 
 - (nullable NSArray<NSString *> *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);  | 
遍历path目录下的文件,并返回一个数组 | 
| 
 - (nullable NSData *)contentsAtPath:(NSString *)path;  | 
获取path下的文件数据 | 
| 
 - (nullable NSArray<NSString *> *)subpathsAtPath:(NSString *)path;  | 
以递归方式获取子项目录列表 | 
| 
 + (NSString *)pathWithComponents:(NSArray<NSString *> *)components;  | 
通过一个数组创建路径 | 
| 
 pathComponents  | 
获取路径的组成部分,是一个数组 | 
| 
 lastPathComponent  | 
路径的最后一部分 | 
| 
 pathExtension  | 
文件扩展名 | 
| 
 - (NSString *)stringBy+<Appending/Deleting>+Path+<Component/Extension>:(NSString *)str;  | 
<拼接/删除>+<路径/后缀>名在末尾 | 
四、NSFileHandle文件句柄类(相当于c语言的文件File)
1.用于针对文件的I/0操作,相当于一个文件操作手柄,能更有效的控制文件,类似C语言的文件管理。
2.使用NSFileHandle
1> 需要打开一个文件,然后获取一个NSFileHandle对象(注意:如果这个文件不存在,则使用下列方法时不能获取到NSFileHandle对象)
// 打开一个文件并准备读取
NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:path]; // 打开一个文件并准备写入
NSFileHandle *fp = [NSFileHandle fileHandleForWritingAtPath:path]; // 打开一个文件并准备更新(读写)
NSFileHandle *fp = [NSFileHandle fileHandleForUpdatingAtPath:path];
2> 对打开的文件进行I/0操作
// 写入文件
[data WriteToFile:path atomically:YES]
3> 关闭文件(注意:在C语言中,所有操作完成之后都会关闭文件,这里也一定要关闭,为了保证文件的安全)
// 关闭文件
[fp closeFile];
3.NSFileHandle的重要概念:句柄(下面流程有助于了解句柄的作用)----具体会在后续写NSURLConnection中用到。
给文件做一个标记,让用户下次写入文件的时候从这个标记处开始存储。而seekToEndOfFile方法则是每次存储完后都将句柄移动至该文件末尾。

五、NSProcessInfo(了解)
-(NSArray*)arguments //以数组的形式返回当前进程的参数 -(int)processIdentifier //返回进程标识符(进程id),用于识别每个正在运行的进程 -(NSString*)processName //返回当前正在执行的进程名称 -(NSString *)globallyUniqueString //每次调用这个方法时,都返回不同的单值字符串,可以用这个字符串生成单值临时文件名 -(NSString *)hostname //返回主机系统的名称 -(NSUInteger)operatingSystem //返回表示操作系统的数字
-(NSString *)operatingSystemName //返回操作系统的名称 -(NSString *)operatingSystemVersionString //返回操作系统的当前版本
-(void)setProcessName:(NSString *)name //将当前进程名称设置为name。应该谨慎地使用这个方法,应为关于进程名称存在一些假设(比如用户默认的设置)
【IOS学习基础】文件相关的更多相关文章
- 【IOS学习基础】NSObject.h学习
		
一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface N ...
 - 【IOS学习基础】OC类的相关
		
几天前突然在别人的类的.m文件中看到这么一句代码:@synthesize xxxx = _xxxx; 当时愣是没理解啥意思,过后才缓过神来发现原来是把一些类的基础知识忘记了,虽然不用过多去深究以前的一 ...
 - 【IOS学习基础】归档和解档
		
一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅 ...
 - 【IOS学习基础】内存管理
		
1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. ...
 - ios学习基础篇一
		
搜集的不错的oc学习资料 大概总结: http://my.oschina.net/luoguankun/blog/208526 详细教程: http://www.w3cschool.cc/ios/io ...
 - 【IOS学习基础】weak和strong、懒加载、循环引用
		
一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...
 - linux学习笔记-文件相关知识
		
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.文件属性 在当前用户家目录下以ls -al命令输出为例: -rw-r--r-- 1 renren ...
 - IOS学习基础
		
http://www.jikexueyuan.com/path/ios/ 界面优化 iOS界面绘图API.控件等知识. 1,绘制图片 2,画板实例 3, 1,UIView的setNeedsDispla ...
 - iOS学习笔记01-APP相关
		
AppDelegate对象方法 # 程序第一次启动后才会执行 - (BOOL)application:(UIApplication *)application didFinishLaunchingWi ...
 
随机推荐
- MongoDB学习笔记04
			
创建索引使用ensureIndex方法,对于同一个集合,同样的索引只需要创建一次,反复创建是徒劳的. 对某个键的索引会加速对该键的查询,然而,对于其它查询可能没有帮助,即便是查询中包含了被索引的键.实 ...
 - HttpURLConnection 下载代码
			
private int downloadFile(final String apkurl, final String apkname) { Log.e(LOGTAG, "downloadAp ...
 - Repeater数据绑定和操作
			
Repeater使用详细指南 ASP.NET WebForm开发中尽量少用系统提供的runat="server"的服务器控件,尤其像GridView之类的“重量级”武器,自动生成的 ...
 - Image的Stride
			
参看下面链接:http://msdn.microsoft.com/en-us/library/aa473780
 - jquery find()和filter()的区别
			
在写js查找当前标签下某一子元素的子元素集合时,用到了此方法 $(".flyout-trigger").mouseover(function(){ var maxnum=$(thi ...
 - 让PHP程序永远在后台运行
			
PHP里有个函数很有用.这是在最近的开发中才逐渐用到的. int ignore_user_abort ( [bool setting] ) 这个函数的作用是指示服务器端在远程客户端关闭连接后是否继续执 ...
 - spl_autoload_register()
			
5.3版本增加了命名空间prepend函数 <?php // function __autoload($class) {// include 'classes/' . $class ...
 - linux查找命令find
			
-1 linux的查找命令有两个: locate find locate:有一个索引库,故速度快,但是新加入的一般不再索引库中,故可能无法查到 find:搜索速度慢,但是功能及其强大,可以追加命令动作 ...
 - python bottle框架(WEB开发、运维开发)教程
			
教程目录 一:python基础(略,基础还是自己看书学吧) 二:bottle基础 python bottle web框架简介 python bottle 框架环境安装 python bottle 框架 ...
 - Ubuntu14.04LST 安装Oracle SQL Developer 4.0.2
			
1:Oracle SQL Developer 4.0.2下载链接: http://www.oracle.com/technetwork/developer-tools/sql-developer/do ...
 
			
		
2> 读取自己的Bundle资源(以百度SDK为例)
而在其demo的“AnnotationDemoViewController.m"文件中,定义了这么几个宏