NSHomeDirectory() 获取到当前APP的沙盒路径..
沙盒路径下有三个文件夹:
(1) temp ->就像命名一样,存放临时文件,在APP关闭再启动后就没有了,不能放重要的东西.
(2) Documents ->除非APP卸载,不然里面东西是不会丢失的,但是也不能存放大文件和下载的东西.在手机连接iTunes备份和iCould备份时会备份此文件夹里面的东西….
(3)Library -> 三个子文件夹-<1>Caches.<2>Cookies.<3>prfereneces
其中,SDWebImage缓存下载的图片就放到了Caches中.我们在网上下载视频/图片的时候也放到这里就OK了..它文件夹名就叫缓存,自然就放缓存咯.
获取Caches路径的方法:
NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject
当然获取各个路径的方法就不写了,这里主要说一下我最近遇到的录制视频,发布到服务器,以及保存所遇到的问题…
录制完视频后我保存到了`NSTemporaryDirectory()`的后面(因为可能不做处理,及时删除),这里打印路径是这样的:
`/private/var/mobile/Containers/Data/Application/8F37E25D-11E2-466F-A491-8D5A8FE11B0C/tmp/myMovie.mov`,
会发现,真机里的temp文件夹,路径最前面在/var前面有一个/private..而且在路径末尾会有一个"/",直接拼接"myMovie.mov"..这是跟Documents和Library不同的..
然后,我直接将字符串转化为NSURL .将视频保存到这个路径下,发现抛了异常:
也就是说在拼接好路径字符串path之后,在转换为NSURL格式的路径时,一定更要用这个方法:
[NSURL fileURLWithPath:outputFielPath];
这个返回的URL才是异常日志里所说的file URL.这个时候打印这个URL,发现路径是这样的:
file:///private/var/mobile/Containers/Data/Application/3790ED15-F9C2-413D-B91A-7D4A1EC2FA1E/tmp/myMovie.mov
是的,转化为file URL会在原先路径前加了file://
所以,你同样也可以用[NSURL urlWithStr:],不过你要在原先字符串上拼接"file://",效果是一样的.
这个”路径”才是用来存储下载或录制的文件的…因为我后面下载的视频在用AFN指定路径的时候没有弄成file URL,导致视频无法使用
这里还要注意的是,我们不能在沙盒下面随意拼接路径,在原有已存在文件夹下面拼接超过一次就意味着你要自己创建一个文件夹了..不然它是不会根据你的/.../...自己创建文件夹..除非自己写一个Cache库或音乐视频类APP,不然好像也用不到创建
创建文件夹链接:http://laiguowei2004.blog.163.com/blog/static/36829000201281753343958/
那么问题来了,既然带有file://的NSURL才是用得上的路径,为什么NSHomeDirectory()不直接带上它?
我们一定还记得从沙盒下删除某些东西…比方说删除原先头像的存储路径
[[NSFileManager defaultManager] removeItemAtPath:outfilePath error:nil];
这里的AtPath 传的是一个NSString..这种传的则是不带file://的最初拼接的路径.笔者愚拙,因此猜测路径Path字符串 和 NSURL 在存储文件方面是两种概念..不仅仅是简单的格式转换……
总结: (1) NSString * outfilePath = [NSTemporaryDirectory() stringByAppendingString:fileName];
这是沙盒temp文件下一个filename文件的路径,用于下载或保存视频图片
NSURL * filePathURL = [NSURL fileURLWithPath:outfilePath];
return filePathURL;
(2) NSString * outfilePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject] stringByAppendingPathComponent:fileName]
;
NSURL * filePathURL = [NSURL fileURLWithPath:outfilePath];
这是沙盒下Caches文件夹下的路径,,,和URL格式的路径…需要传字符串的用前面的,要传NSURL的用后面的.
获取沙盒路径下的文件
outfilePath 是带fileName的
NSURL * filePathURL = [NSURL fileURLWithPath:outfilePath];
NSData *data = [NSData dataWithContentsOfURL:filePathURL];
将一个头像保存到沙盒下 (手动保存一个NSData)
不过大部分的API会只需要传一个URL,它会把数据自己保存到路径下.
[headerData writeToFile: [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject] stringByAppendingPathComponent:@"headImage.png"] atomically:YES];