【IOS】史上最全文件操作NSFileManager

功能列表

//判断文件是否存在
+ (BOOL)fileExistsAtPath:(NSString *)aPath;
//判断文件是否存在Documents下
+ (BOOL)fileExistsAtDocumentsWithFileName:(NSString *)afileName;
//判断文件夹是否存在
+ (BOOL)dirExistAtPath:(NSString *)aPath;


//创建目录
+ (BOOL)createPath:(NSString *)aPath;
// 创建目录的上级目录
+ (BOOL)createParentDirectory:(NSString *)aPath;
// 目录下创建文件
+ (BOOL)createFileWithPath:(NSString *)aPath content:(NSData *)aContent;
// documents下创建文件
+ (BOOL)createFileAtDocumentsWithName:(NSString *)aFilename content:(NSData *)aContent;
+ (NSString *)createFileWithName:(NSString *)aFilename content:(NSData *)aContent;
//TMP下创建文件
+ (NSString *)createFileAtTmpWithName:(NSString *)aFilename content:(NSData *)aContent;
// Caches下创建文件
+ (BOOL)createFileAtCachesWithName:(NSString *)aFilename content:(NSData *)aContent;
//在Document下创建文件目录
+ (BOOL)createDirectoryAtDocument:(NSString *)aDirectory;
// 删除文件
+ (BOOL)deleteFileWithName:(NSString *)aFileName error:(NSError **)aError;
//删除指定路径下的文件
+ (BOOL)deleteFileWithUrl:(NSURL *)aUrl error:(NSError **)aError;
//删除文件夹下的所有文件
+ (BOOL)deleteAllFileAtPath:(NSString *)aPath;
//根据文件名删除document下的文件
+ (BOOL)deleteFileAtDocumentsWithName:(NSString *)aFilename error:(NSError **)aError;


//读取文件
+ (NSData *)readFileWithPath:(NSString *)aPath;
+ (NSData *)readFileWithURL:(NSURL *)aUrl;
+ (NSData *)readFileAtDocumentsWithFileName:(NSString *)aFileName;
//获取临时目录下的所有文件列表
+ (NSArray *)getContentsOfTmpDirectorByTimeOrder;
// 获取文件大小
+ (unsigned long long)fileSizeAtPaht:(NSString *)aPath;
//遍历文件夹下的所有文件,不含子文件
+ (NSArray *)getContentsOfDirectoryAtPath:(NSString *)aDirString;
//遍历文件夹下的所有文件,包含子文件
+ (NSArray *)getAllFilesAtPath:(NSString *)aDirString;
//获取路径下通过时间排序的文件列表
+ (NSArray *)getContentsOfDirectoryByTimeOrderAtPath:(NSString *)aDireString;


//复制一个目录下的文件到另外一个目录,前后两个必须一致,要么都是目录,要么都是文件
+ (BOOL) copyItemAtPath:(NSString *)aPath toPath:(NSString *)aDestinationPath error:(NSError **)aError;
//重命名文件
+ (BOOL)renameFileNameFrom:(NSString *)aOldName toPath:(NSString *)aNewName error:(NSError **)aError;

具体实现


static NSFileManager *iFileManager;

+ (NSFileManager *)getNSFileManager{
    
    if (!iFileManager) {
        iFileManager = [NSFileManager defaultManager];
    }
    return iFileManager;
}

#pragma mark - >>>>>>>>> 判断 <<<<<<<<<<<

#pragma mark - 判断文件是否存在
+ (BOOL)fileExistsAtPath:(NSString *)aPath{
    
    BOOL result = NO;
    if (aPath) {
        result = [[self getNSFileManager] fileExistsAtPath:aPath];
    }
    return result;
}

#pragma mark - 判断文件是否存在Documents下
+ (BOOL)fileExistsAtDocumentsWithFileName:(NSString *)afileName{
    
    BOOL result = NO;
    if (afileName) {
        NSString *fullFileNamePath = [self getFullDocumentPathWithName:afileName];
        result = [[self getNSFileManager] fileExistsAtPath:fullFileNamePath];
    }
    return result;
}

#pragma mark - 判断文件夹是否存在
+ (BOOL)dirExistAtPath:(NSString *)aPath
{
    BOOL isDir = NO;
    BOOL result = [[self getNSFileManager] fileExistsAtPath:aPath isDirectory:&isDir];
    return result && isDir;
}

#pragma mark - >>>>>>>>>创建<<<<<<<<<<<

#pragma mark - 创建目录
+ (BOOL)createPath:(NSString *)aPath{
    
    BOOL result = NO;
    result =[self createParentDirectory:aPath];
    if (result) {
        result = [ [self getNSFileManager] createDirectoryAtPath:aPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    return result;
}

#pragma mark - 创建目录的上级目录
+ (BOOL)createParentDirectory:(NSString *)aPath
{
    //存在上级目录,并且上级目录不存在的创建所有的上级目录
    BOOL result = NO;
    NSString *parentPath = [self getParentPath:aPath];
    if (parentPath && ![self dirExistAtPath:parentPath]) {
        return [[self getNSFileManager] createDirectoryAtPath:parentPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    else if ([self dirExistAtPath:parentPath]){
        result = YES;
    }
    
    return result;
}

#pragma mark 目录下创建文件
+ (BOOL)createFileWithPath:(NSString *)aPath content:(NSData *)aContent
{
    BOOL result = NO;
    result = [self createParentDirectory:aPath];
    if (result) {
        result = [[self getNSFileManager] createFileAtPath:aPath contents:aContent attributes:nil];
    }
    return result;
}

#pragma mark documents下创建文件
+ (BOOL)createFileAtDocumentsWithName:(NSString *)aFilename
                              content:(NSData *)aContent
{
    NSString *filePath =[self getFullDocumentPathWithName:aFilename];
    BOOL result = [self createFileWithPath:filePath
                                   content:aContent];
    return result;
}
+ (NSString *)createFileWithName:(NSString *)aFilename
                         content:(NSData *)aContent
{
    NSString *filePath =[self getFullDocumentPathWithName:aFilename];
    BOOL result = [self createFileWithPath:filePath
                                   content:aContent];
    if(!result)
    {
        filePath = nil;
    }
    return filePath;
}

#pragma mark TMP下创建文件
+ (NSString *)createFileAtTmpWithName:(NSString *)aFilename
                              content:(NSData *)aContent
{
    NSString *filePath =[self getFullTmpPathWithName:aFilename];
    BOOL result = [self createFileWithPath:filePath
                                   content:aContent];
    if(!result)
    {
        filePath = nil;
    }
    return filePath;
    
}
#pragma mark Caches下创建文件
+ (BOOL)createFileAtCachesWithName:(NSString *)aFilename
                           content:(NSData *)aContent
{
    NSString *filePath =[self getFullCachesPathWithName:aFilename];
    BOOL result = [self createFileWithPath:filePath
                                   content:aContent];
    return result;
}
#pragma mark 在Document下创建文件目录
+ (BOOL)createDirectoryAtDocument:(NSString *)aDirectory
{
    NSString * directoryAll = [self getFullDocumentPathWithName:aDirectory];
    
    BOOL result = [ [self getNSFileManager] createDirectoryAtPath:directoryAll
                                      withIntermediateDirectories:YES
                                                       attributes:nil
                                                            error:nil];
    return result;
}

#pragma mark - >>>>>>>>>删除<<<<<<<<<

#pragma mark 删除文件
+ (BOOL)deleteFileWithName:(NSString *)aFileName
                     error:(NSError **)aError
{
    NSFileManager *tempFileManager = [self getNSFileManager];
    return [tempFileManager removeItemAtPath:aFileName
                                       error:aError];
}

#pragma mark - 删除指定路径下的文件
+ (BOOL)deleteFileWithUrl:(NSURL *)aUrl error:(NSError **)aError
{
    return [[self getNSFileManager] removeItemAtURL:aUrl error:aError];
}

#pragma mark 删除文件夹下的所有文件
+ (BOOL)deleteAllFileAtPath:(NSString *)aPath
{
    BOOL result = NO;
    NSArray *fileArray = [self getContentsOfDirectoryAtPath:aPath];
    
    
    NSString *filePath = nil;
    
    for (int i = 0; i<[fileArray count]; i++)
    {
        filePath = [aPath stringByAppendingPathComponent:[fileArray objectAtIndex:i]];
        result = [[self getNSFileManager] removeItemAtPath:filePath
                                                     error:nil];
        if (!result)
        {
            break;
        }
        filePath = nil;
    }
    return result;
}

#pragma mark 根据文件名删除document下的文件
+ (BOOL)deleteFileAtDocumentsWithName:(NSString *)aFilename
                                error:(NSError **)aError
{
    NSString *filePath = [self getFullDocumentPathWithName:aFilename];
    return [self deleteFileWithName:filePath
                              error:aError];
}

#pragma mark 读取文件
+ (NSData *)readFileWithPath:(NSString *)aPath
{
    NSData *data = [NSData dataWithContentsOfFile:aPath];
    return data;
}

+ (NSData *)readFileWithURL:(NSURL *)aUrl
{
    NSData *data = [NSData dataWithContentsOfURL:aUrl];
    return data;
}
+ (NSData *)readFileAtDocumentsWithFileName:(NSString *)aFileName
{
    NSString *fullPathWithName =  [self getFullDocumentPathWithName:aFileName];
    NSData *data = [NSData dataWithContentsOfFile:fullPathWithName];
    return data;
}

#pragma mark - 获取临时目录下的所有文件列表
+ (NSArray *)getContentsOfTmpDirectorByTimeOrder
{
    return [self getContentsOfDirectoryByTimeOrderAtPath:[self getTmpPath]];
}
#pragma mark - 获取文件大小
+ (unsigned long long)fileSizeAtPaht:(NSString *)aPath
{
    return  [[[self getNSFileManager] attributesOfItemAtPath:aPath  error:nil] fileSize];
}

#pragma mark - >>>>>>>>>获取<<<<<<<<<<<

#pragma mark - 获取上级目录
+ (NSString *)getParentPath:(NSString *)aPath
{
    // //删除最后一个目录
    return [aPath stringByDeletingLastPathComponent];
}

#pragma mark 根据文件名称获取documents的文件名的全路径
+ (NSString *)getFullDocumentPathWithName:(NSString *)aFileName
{
    return [[self getDocumentPath] stringByAppendingString:aFileName];
}

#pragma mark 根据文件名称获取tmp的文件名的全路径
+ (NSString *)getFullTmpPathWithName:(NSString *)aFileName
{
    return [[self getTmpPath] stringByAppendingPathComponent:aFileName];
}

#pragma mark 根据文件名称获取Caches的文件名的全路径
+ (NSString *)getFullCachesPathWithName:(NSString *)aFileName
{
    return [[self getCachesPath] stringByAppendingPathComponent:aFileName];
}

+ (NSString *)getHomePath
{
    NSString *home = [@"~" stringByExpandingTildeInPath];
    return home;
}

#pragma mark 获取documents的全路径
+ (NSString *)getDocumentPath
{
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *result = [path objectAtIndex:0];
    return result;
}

#pragma mark 获取tmp路径
+ (NSString *)getTmpPath
{
    NSString *pathName = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
    return pathName;
}

#pragma mark 获取caches路径
+ (NSString *)getCachesPath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
    return [paths objectAtIndex:0];
}
#pragma mark 遍历文件夹下的所有文件,不含子文件
+ (NSArray *)getContentsOfDirectoryAtPath:(NSString *)aDirString
{
    return [[self getNSFileManager] contentsOfDirectoryAtPath:aDirString
                                                        error:nil];
}

#pragma mark - 获取路径下通过时间排序的文件列表
+ (NSArray *)getContentsOfDirectoryByTimeOrderAtPath:(NSString *)aDireString
{
    NSArray *files = [self getAllFilesAtPath:(NSString *)aDireString];
    
    NSMutableArray *iUrls = [[NSMutableArray alloc] initWithCapacity:1];
    NSArray *sortedFiles = nil;
    
    if([files count] > 0)
    {
        sortedFiles = [files sortedArrayUsingComparator:^(NSString *url1, NSString *url2)
                       {
                           
                           NSDictionary *fileAttributes1 = [[self getNSFileManager] attributesOfItemAtPath:url1
                                                                                                     error:nil];
                           
                           NSDictionary *fileAttributes2 = [[self getNSFileManager] attributesOfItemAtPath:url2
                                                                                                     error:nil];
                           NSDate *date1 = [fileAttributes1 objectForKey:NSFileCreationDate] ;
                           
                           NSDate *date2 = [fileAttributes2 objectForKey:NSFileCreationDate] ;
                           return [date2 compare:date1];
                       }];
    }
    
    for (int i = 0; i < [sortedFiles count]; i++)
    {
        NSURL *url = [NSURL fileURLWithPath:[sortedFiles objectAtIndex:i]];
        [iUrls addObject:url];
    }
    
    return iUrls;
    
}

#pragma mark - 遍历文件夹下的所有文件,包含子文件
+ (NSArray *)getAllFilesAtPath:(NSString *)aDirString
{
    NSMutableArray *tempPathArray = [NSMutableArray array];
    NSArray *tempArray =[self getContentsOfDirectoryAtPath:aDirString];
    NSString *fullPath = nil;
    
    for (NSString *fileNmae in tempArray) {
        BOOL flag = YES;
        fullPath = [aDirString stringByAppendingPathComponent:fileNmae];
        //判断是否存在
        if ([[self getNSFileManager] fileExistsAtPath:fullPath isDirectory:&flag]) {
            //不是目录,直接添加
            if (![[fileNmae substringToIndex:1]isEqualToString:@"."]) {
                [tempPathArray addObject:fullPath];
            }
            //如果是目录,一当前文件夹为key,文件夹下的子文件名为value,递归调用
            else{
                NSArray *subPathArray =[self getAllFilesAtPath:fullPath];
                [tempPathArray addObjectsFromArray:subPathArray];
                
            }
        }
        fullPath = nil;
    }
    NSArray *resultArray = [NSArray arrayWithArray:tempPathArray];
    return resultArray;
    
}


#pragma mark 复制一个目录下的文件到另外一个目录,前后两个必须一致,要么都是目录,要么都是文件
+ (BOOL) copyItemAtPath:(NSString *)aPath
                 toPath:(NSString *)aDestinationPath
                  error:(NSError **)aError
{
    NSFileManager *tempFileManager = [self getNSFileManager];
    return [tempFileManager copyItemAtPath:aPath
                                    toPath:aDestinationPath
                                     error:aError];
}

#pragma mark 重命名文件
+ (BOOL)renameFileNameFrom:(NSString *)aOldName
                    toPath:(NSString *)aNewName
                     error:(NSError **)aError{
    NSFileManager *tempFileManager = [self getNSFileManager];
    BOOL result =  [tempFileManager moveItemAtPath:aOldName
                                            toPath:aNewName
                                             error:aError];
    return result;
}


@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,949评论 25 707
  • 不知道从何时起,每年一度的儿童节,成了我们这些大人的狂欢日,每年都有新花样,今年也不例外。晒童年时的玩具,发童年照...
    大俗小雅阅读 682评论 0 2
  • 杭州的美,不在于人,而在于每一寸土地 来到杭州也有几日了,烟雨朦胧中掠过西湖几多风景。景依旧,心情不再,再美丽景色...
    熊先生频道MrBearTV阅读 151评论 0 0
  • 造化之力神奇,时间却比造化更加神奇。 人生 既欣赏不食人间烟火的诗意 也欣赏柴米油盐的现世安稳 有酒有故事 ...
    蓝莫潇骁阅读 422评论 12 6
  • “在那海水酣睡的宫殿里, 铺满了多少奇珍异宝。” 在人们眼中 海洋是美丽而又神秘的 画家笔下的海同样富有魅力 也许...
    艺伙阅读 170评论 0 3