iOS的沙盒机制,应用只能访问自己应用目录下的文件。iOS不像android,没有SD卡概念,不能直接访问图像、视频等内容。iOS应用产生的内容,如图像、文件、缓存内容等都必须存储在自己的沙盒内。默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。Library包含Caches、Preferences目录。
Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,保存应用的持久化数据,用于应用升级或者应用关闭后的数据保存,不会被itunes同步,所以为了减少同步的时间,可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。
tmp:提供一个即时创建临时文件的地方,但不需要持久化,在应用关闭后,该目录下的数据将删除,也可能系统在程序不运行的时候清除。
可参考: http://blog.csdn.net/xyz_lmn/article/details/8968213
//
// ZJD_FileManageUnit.h
// MYCode
//
// Created by aidong on 14-9-2.
// Copyright (c) 2014年 aidong. All rights reserved.
//
/**
* 登陆成功时就要同时获取或创建用户文件目录
* 以后基本操作都基于该文件路径下
*
* [ZJD_FileManageUnit userPath:[FDUserObject shared].userID];
* [ZJD_FileManageUnit userFolder];
*
*/
#import <Foundation/Foundation.h>
@interface ZJD_FileManageUnit : NSObject
// 用户路径
+ (NSString *)userPath:(NSString *)path;
// 用户根文件夹
+ (NSString *) userFolder;
// 用户根文件夹下的文件夹
+ (NSString *) userFolder:(NSString *)folder;
// 获取非用户文件存储路径
+ (NSString *) documentFolder;
// 获取单个文件的大小
+ (long long) fileSizeAtPath:(NSString *) filePath;
// 获取某个文件夹的大小
+ (float ) folderSizeAtPath:(NSString *) folderPath;
@end
//
// ZJD_FileManageUnit.m
// MYCode
//
// Created by aidong on 14-9-2.
// Copyright (c) 2014年 aidong. All rights reserved.
//
#import "ZJD_FileManageUnit.h"
// 已在PrefixHeader.pch 定义过
//#define NFM_DM [NSFileManager defaultManager]
@implementation ZJD_FileManageUnit
// 用户路径
+(NSString *)userPath:(NSString *)path{
if (path == nil) {
return [[NSUserDefaults standardUserDefaults] objectForKey:@"userPath"];
}else{
[[NSUserDefaults standardUserDefaults] setObject:path forKey:@"userPath"];
return path;
}
}
// 获取存当前登陆用户文件夹
+(NSString *) userFolder{
NSString *document;
if ([ZJD_FileManageUnit userPath:nil]!=nil) {
document = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Library/Caches/Data/%@",[ZJD_FileManageUnit userPath:nil]]];
}else{
// document = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/Data"];
}
if (![NFM_DM fileExistsAtPath:document] ) {
NSError *error;
if (![NFM_DM createDirectoryAtPath:document withIntermediateDirectories:YES attributes:nil error:&error]) {
// 创建新文件夹
NSLog(@"error:%@",error);
}
}
// NSLog(@"当前登录用户文件夹地址:%@",document);
// 取得一个目录下得所有文件名
// NSArray *files = [NFM_DM subpathsAtPath:document];
// NSLog(@"当前文件夹下所有的文件名: %@",files);
return document;
}
// 获取或创建当前登陆用户文件夹下某个文件夹
+(NSString *) userFolder:(NSString *)folder{
NSString *document;
if ([ZJD_FileManageUnit userPath:nil]!=nil) {
document = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Library/Caches/Data/%@/%@",[ZJD_FileManageUnit userPath:nil],folder]];
}else{
document = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/Data"];
}
if (![NFM_DM fileExistsAtPath:document] ) {
NSError *error;
if (![NFM_DM createDirectoryAtPath:document withIntermediateDirectories:YES attributes:nil error:&error]) {
NSLog(@"error:%@",error);
}
}
// NSLog(@"当前文件夹地址:%@",document);
return document;
}
// 与上面略有区别,用时请注意。(主要用于对于其它非用户文件夹的操作)
+(NSString *) documentFolder{
NSString *document;
document = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/Data/Common"];
if (![NFM_DM fileExistsAtPath:document] ) {
NSError *error;
if (![NFM_DM createDirectoryAtPath:document withIntermediateDirectories:YES attributes:nil error:&error]) {
NSLog(@"error:%@",error);
}
}
//NSLog(@"document :%@",document);
return document;
}
#pragma mark -
#pragma mark - 获取文件大小
//单个文件的大小
+ (long long)fileSizeAtPath:(NSString *) filePath{
if ([NFM_DM fileExistsAtPath:filePath]){
return [[NFM_DM attributesOfItemAtPath:filePath error:nil] fileSize];
}
return 0;
}
//遍历文件夹获得文件夹大小,返回多少M
+ (float)folderSizeAtPath:(NSString *) folderPath{
if (![NFM_DM fileExistsAtPath:folderPath]) return 0;
NSEnumerator *childFilesEnumerator = [[NFM_DM subpathsAtPath:folderPath] objectEnumerator];
NSString* fileName;
long long folderSize = 0;
while ((fileName = [childFilesEnumerator nextObject]) != nil){
NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];
folderSize += [self fileSizeAtPath:fileAbsolutePath];
}
return folderSize/(1024.0*1024.0);
}
@end