iOS NSFileManager 文件管理常用方法介绍

简介

特点
  • 1.NSFileManager是一个单例,相当于全局变量.
  • 2.NSFileManager用来管理和操作沙盒中的文件和文件夹.
  • 3.每个路径名都是一个NSString对象.
  • 4.可对文件或文件夹进行创建/删除/复制/粘贴等操作.
建议使用场景

管理沙盒中的文件或文件夹.

常用方法
image.png
//
//  UIViewController+FileManager.m
//  myview
//
//  Created by mingzhou wang on 2022/4/30.
//

#import "UIViewController+FileManager.h"
@implementation UIViewController (FileManager)

#pragma mark -- 创建文件的路径
-(NSString*)createFilePath:(NSString*)fileName{
    NSString * filePathString = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    return [NSString stringWithFormat:@"%@/%@",filePathString,fileName];
}
#pragma mark 创建文件
-(void)createFile:(NSString*)fileString{
    /**
     创建文件
     @parm createFileAtPath 文件的路径
     @parm contents 文件创建时写入的内容,可为nil
     @parm attributes 文件的属性,可为nil
     */
    BOOL isFile = [[NSFileManager defaultManager] createFileAtPath:[self createFilePath:fileString] contents:nil attributes:nil];
    if (!isFile) {
        NSLog(@"创建失败");
        return;
    }
    /**
     判断文件是否存在
     */
    [self judgeObjectExistence:[self createFilePath:@"NetWork小贱.plist"]];
}
 
 
#pragma mark -- 创建文件夹
-(void)createFolder:(NSString*)folderString{
    /**
     创建文件夹
     
     @parm path 创建文件夹的路径
     @parm createIntermediates 是否展开文件夹的中间目录
     @parm attributes 是创建文件夹设置的属性,可为nil
     @parm error 创建文件夹返回的错误对象,可为nil
     */
    NSError * error = nil;
    BOOL isFolder = [[NSFileManager defaultManager] createDirectoryAtPath:[self createFilePath:folderString] withIntermediateDirectories:YES attributes:nil error:&error];
    if (!isFolder) {
        NSLog(@"createFolder_error:%@",error);
        return;
    }
    /**
     判断文件夹是否存在
     */
    [self judgeObjectExistence:[self createFilePath:@"NetWork"]];
}
 
 
#pragma mark -- 判断文件是否存在
-(void)judgeObjectExistence:(NSString*)objectPath{
    /**
     判断文或者文件夹
     BOOL Existence = [fileManager fileExistsAtPath:objectPath isDirectory:YES];
     */
    BOOL isExistence = [[NSFileManager defaultManager] fileExistsAtPath:objectPath];
    if (!isExistence) {
        NSLog(@"不存在");
        return;
    }
    /**
     判断文件或者文件夹是否可读
     */
    [self judgeObjectReadJurisdiction:objectPath];
    /**
     判断文件或者文件夹是否可写权限
     */
    [self judgeObjectWritJurisdiction:objectPath];
    /**
     判断文件是否是可执行文件
     */
    [self judgeObjectExecutJurisdiction:objectPath];
    /**
     判断是否是可删除的对象
     */
    [self judgeObjectDeletJurisdiction:objectPath];
    /**
     获取可视化的文件字符串
     */
    [self getVisualizationFileString:objectPath];
}
 
 
#pragma mark -- 判断对象的权限是否可读
-(void)judgeObjectReadJurisdiction:(NSString*)objectPath{
    /**
     判断对象是否有可读权限
     @parm path 对象路径
     */
    BOOL isRead = [[NSFileManager defaultManager] isReadableFileAtPath:objectPath];
    if (!isRead) {
        NSLog(@"没有可读权限");
    }
}
 
 
#pragma mark -- 判断对象是否有可写的权限
-(void)judgeObjectWritJurisdiction:(NSString*)objectPath{
    /**
     判断对象是否有可写权限
     @parm path 对象路径
     */
    BOOL isWrit = [[NSFileManager defaultManager] isWritableFileAtPath:objectPath];
    if (!isWrit) {
        NSLog(@"没有可写权限");
    }
}
 
 
#pragma mark -- 判断是否是可执行文件
-(void)judgeObjectExecutJurisdiction:(NSString*)objectPath{
    /**
     判断是否是可执行文件
     @parm path 对象路径
     知识:
     可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。
     */
    BOOL isExecut = [[NSFileManager defaultManager] isExecutableFileAtPath:objectPath];
    if (!isExecut) {
        NSLog(@"不是可执行文件");
    }
}
 
 
#pragma mark -- 判断文件或者文件夹是否可以删除
-(void)judgeObjectDeletJurisdiction:(NSString*)objectPath{
    /**
     判断是否是可可删除的对象
     @parm path 对象路径
     */
    BOOL isDelet = [[NSFileManager defaultManager] isDeletableFileAtPath:objectPath];
    if (!isDelet) {
        NSLog(@"不可删除的对象");
    }
}
 
 
#pragma mark 文件数据的写入
-(void)writeToFile:(NSString*)content path:(NSString*)path{
    NSData * data = [content dataUsingEncoding:NSUTF8StringEncoding];
    BOOL isFinish = [data writeToFile:path atomically:YES];
    if (!isFinish) {
        NSLog(@"写入失败");
    }
}
 
 
#pragma mark --  判断两个文件内容是否相等
-(void)fileContentComparison{
    /**
     测试文件内容是否相等
     */
    NSArray * contentArray = @[@"清明时节雨纷纷",@"路上行人欲断魂",@"成功QQ吧",@"成功QQ吧"];
    NSArray * fileNameArray = @[@"cg_a.txt",@"cg_b.txt",@"cg_c.txt",@"cg_d.txt"];
    /**
     创建文件,并写入数据
     */
    for (unsigned int i =0 ; i<fileNameArray.count; i++) {
        BOOL isFile = [[NSFileManager defaultManager] createFileAtPath:[self createFilePath:fileNameArray[i]] contents:contentArray[i] attributes:nil];
        if (!isFile) {
            NSLog(@"文件创建失败");
        }
    }
    /**
     进行分组比较
     */
    for (unsigned int i =0; i<fileNameArray.count; i++) {
        /**
         文件内容的比较
         @parm  path1,path2 文件的路径
         */
        if (i==0||i%2==0) {
            NSLog(@"%d",i);
            BOOL isIdentical = [[NSFileManager defaultManager] contentsEqualAtPath:[self createFilePath:fileNameArray[i]] andPath:[self createFilePath:fileNameArray[i+1]]];
            if (!isIdentical) {
                NSLog(@"文件不相同-%@--%@",fileNameArray[i],fileNameArray[i+1]);
            }else{
                NSLog(@"文件相同-%@--%@",fileNameArray[i],fileNameArray[i+1]);
            }
            /**
             输出:
             2017-03-30 15:08:04.833 NSFileManager[3899:940954] 0
             2017-03-30 15:08:04.833 NSFileManager[3899:940954] 文件不相同-cg_a.txt--cg_b.txt
             2017-03-30 15:08:04.834 NSFileManager[3899:940954] 2
             2017-03-30 15:08:04.834 NSFileManager[3899:940954] 文件相同-cg_c.txt--cg_d.txt
             */
        }
    }
}
 
 
#pragma mark -- 获取可视化文件字符串
-(void)getVisualizationFileString:(NSString*)path{
    NSString * displayNameAtPath = [[NSFileManager defaultManager] displayNameAtPath:path];
    NSLog(@"可视化串:%@",displayNameAtPath);
    /**
     输出:
     2017-03-30 15:28:27.354 NSFileManager[4108:1007542] 可视化串:NetWork小贱.plist
     2017-03-30 15:28:27.355 NSFileManager[4108:1007542] 可视化串:NetWork
     
     注意:
     该返回的可视化字符串,不可用于其他函数的参数。对于本地的文件,将返回合适的字符串。
     */
}
 
 
 
#pragma mark 文件或者文件夹的拷贝
-(void)copyFile{
    [self createFolder:@"A"];
    [self createFile:@"A/a.txt"];
    [self createFolder:@"B"];
    [self createFolder:@"B/C"];
    NSString * FloderNameStr = [self createFilePath:@"A"];
    NSString * fileNameStr = [self createFilePath:@"A/a.txt"];
    NSString * fileName = [self createFilePath:@"B/b.txt"];
    NSString * FloderName = [self createFilePath:@"C"];
    /**
     文件夹的复制
     */
    [self copyObject:FloderNameStr toPath:FloderName];
    /**
     文件的复制
     */
    [self copyObject:fileNameStr toPath:fileName];
    /**
     输出:
     NSFileManager[5178:1361817] 复制成功
     NSFileManager[5178:1361817] 复制成功
     注意:
     文件和文件夹的复制,复制文件不能提前比被复制文件存在。比如:B要复制A,那B在复制前不能存在,否则将不成功。
     */
}
-(void)copyObject:(NSString*)path toPath:(NSString*) path1 {
    /**
     文件夹的拷贝
     @parm  srcPath  要复制的文件夹路径
     @parm  dstPath  目的文件夹路径
     @parm  error    错误信息
     */
    NSError * error;
    BOOL isFolder = [[NSFileManager defaultManager] copyItemAtPath:path toPath:path1 error:&error];
    if (!isFolder) {
        NSLog(@"文件夹复制失败-%@",error);
        return;
    }
    NSLog(@"复制成功");
}
 
 
#pragma mark -- 文件和文件夹的移动
-(void)moveFile{
    /**
     文件夹的移动
     */
    [self createFolder:@"M_1"];
    NSString * Folder_M1_Path = [self createFilePath:@"M_1"];
    NSString * Folder_M2_Path = [self createFilePath:@"M_2"];
    /**
     我们要将 M_1 移动到 M_2 里面
     */
    [self moveObject:Folder_M1_Path toPath:Folder_M2_Path];
    /**
     文件的移动
     */
    [self createFile:@"m.txt"];
    NSString * filePath = [self createFilePath:@"m.txt"];
    NSString * Folder_M3_Path = [self createFilePath:@"M_3"];
    [self moveObject:filePath toPath:Folder_M3_Path];
    /**
     输出:
     2017-03-30 17:23:59.848 NSFileManager[5818:1525452] 移动成功!
     2017-03-30 17:23:59.849 NSFileManager[5818:1525452] 移动成功!
     */
}
-(void)moveObject:(NSString*)path1 toPath:(NSString*)path2{
    /**
     对象的移动
     @parm  srcPath 要移动的对象路径
     @parm  dstPath 移动后的对象路径
     @parm  error    错误信息
     */
    NSError * error ;
    BOOL isMove = [[NSFileManager defaultManager] moveItemAtPath:path1 toPath:path2 error:&error];
    if (isMove) {
        NSLog(@"移动成功!");
    }
}
 
 
#pragma mark 创建文件或文件夹间的硬链接
-(void)linkFile{
    /**
     创建文件夹
     */
    [self createFile:@"L_k_1.txt"];
    NSString * FolderPath =  [self createFilePath:@"L_k_1.txt"];
    NSString * FolderLinkPath =  [self createFilePath:@"L_k_2.txt"];
    /**
     创建链接
     */
    [self linkObject:FolderPath toPath:FolderLinkPath];
    /**
     输出:
     2017-03-30 17:56:53.320 NSFileManager[6181:1659306] 链接成功!
     */
}
-(void)linkObject:(NSString*)path1 toPath:(NSString*)path2{
    /**
     对象间创建硬链接
     @parm  srcPath 要链接的对象路径
     @parm  dstPath 链接后的对象路径
     @parm  error   错误信息
     */
    NSError * error ;
    BOOL isLink = [[NSFileManager defaultManager] linkItemAtPath:path1 toPath:path2 error:&error];
    if (isLink) {
        NSLog(@"链接成功!");
    }
    [@"my love show" writeToFile:[self createFilePath:@"L_k_2.txt"] atomically:YES encoding:NSUTF8StringEncoding error:NULL];
    NSString * FolderLinkPath =  [self createFilePath:@"L_k_1.txt"];
    NSLog(@"%@",[NSString stringWithContentsOfFile:FolderLinkPath encoding:NSUTF8StringEncoding error:NULL]);
}
 
 
#pragma mark  -- 删除文件
-(void)removeFile{
    /**
     删除文件夹
     */
    [self createFolder:@"Love"];
    [self removeObject:[self createFilePath:@"Love"]];
    /**
     删除文件
     */
    [self createFile:@"remove.txt"];
    [self removeObject:[self createFilePath:@"remove.txt"]];
 
}
-(void)removeObject:(NSString*)path{
    /**
     检测文件是否存在
     */
    BOOL isExistence = [[NSFileManager defaultManager] fileExistsAtPath:path];
    if (isExistence) {
        NSError * error ;
        BOOL isRemove = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
        if (isRemove) {
            NSLog(@"%@",@"删除成功");
        }else{
            NSLog(@"删除失败--error:%@",error);
        }
    }else{
        NSLog(@"文件不存在,请确认路径");
    }
    /**
     输出:
     2017-03-31 11:28:24.004 NSFileManager[2190:371451] 删除成功
     2017-03-31 11:28:24.007 NSFileManager[2190:371451] 删除成功
     */
}
 
 
#pragma mark -- 获取数据
-(void)getDataFile{
    BOOL isFile = [[NSFileManager defaultManager] createFileAtPath:[self createFilePath:@"abc.txt"] contents:[@"成功QQ吧" dataUsingEncoding:NSUTF8StringEncoding ] attributes:nil];
    if (isFile) {
        [self getData:[self createFilePath:@"abc.txt"]];
    }
}
-(void)getData:(NSString*)path{
    if (!path) return;
    NSData * data = [[NSFileManager defaultManager] contentsAtPath:path];
    NSString * content = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"获取数据:%@",content);
}
 
 
#pragma mark --  获取文件或者文件夹的层次结构
-(void)getArrangement{
    /**
     文件夹层次
     */
    [self createFolder:@"ABC/BS/CKK/wwq"];
    [self getArrangementObject:[self createFilePath:@"ABC"]];
    /**
     输出:
     2017-03-31 15:54:00.584 NSFileManager[4859:1110472] 文件的层次:(
     BS,
     "BS/CKK",
     "BS/CKK/wwq"
     )
     
     注意:
     该方法一版不要调用,因为计算损耗较大
     */
}
-(void)getArrangementObject:(NSString*)path{
    if (!path) return;
    NSArray * array = [[NSFileManager defaultManager] subpathsAtPath:path];
    NSLog(@"文件的层次:%@",array);
}
 
 
#pragma mark --  获取文件或者文件夹在系统中代表的字符
-(void)getfileSystemRepresentation{
    /**
     创建一个文件
     */
    [self createFolder:@"SR_Love"];
    const char * ar = [[NSFileManager defaultManager] fileSystemRepresentationWithPath:[self createFilePath:@"SR_Love"]];
    NSLog(@"字符:%s",ar);
}
 
 
#pragma mark  --  获取文件属性
-(void)getFileAttribute{
    [self createFolder:@"Attribute"];
    /**
     获取路径
     */
    NSString * FolderPath = [self createFilePath:@"Attribute"];
    NSDictionary * FileAttribute = [[NSFileManager defaultManager] attributesOfItemAtPath:FolderPath error:NULL];
    NSLog(@"文件的属性:%@",FileAttribute);
    /**
     输出:
     2017-03-31 16:35:43.572 NSFileManager[5283:1231846] 文件的属性:{
     NSFileCreationDate = "2017-03-31 08:35:43 +0000";
     NSFileExtensionHidden = 0;
     NSFileGroupOwnerAccountID = 20;
     NSFileGroupOwnerAccountName = staff;
     NSFileModificationDate = "2017-03-31 08:35:43 +0000";
     NSFileOwnerAccountID = 501;
     NSFilePosixPermissions = 493;
     NSFileReferenceCount = 2;
     NSFileSize = 68;
     NSFileSystemFileNumber = 22010573;
     NSFileSystemNumber = 16777218;
     NSFileType = NSFileTypeDirectory;
     }
     
     
     介绍:
     NSFileCreationDate          文件创建的时间
     NSFileExtensionHidden       文件路径是否展开
     NSFileGroupOwnerAccountID   创建分组的ID
     NSFileGroupOwnerAccountName 创建分组的名字
     NSFileModificationDate      文件修改的时间
     NSFileOwnerAccountID        创建者的ID
     NSFilePosixPermissions      文件权限的编号
     NSFileReferenceCount        文件参考数量
     NSFileSize                  文件大小
     NSFileSystemFileNumber      系统文件编号
     NSFileSystemNumber          系统编号
     NSFileType                  文件类型
     */
}
 
 
#pragma mark  --  NSFileManagerDelegate
/**
 文件移动
 */
-(BOOL)fileManager:(NSFileManager *)fileManager shouldRemoveItemAtURL:(NSURL *)URL{
    return YES;
}
-(BOOL)fileManager:(NSFileManager *)fileManager shouldRemoveItemAtPath:(NSString *)path{
    return YES;
}
/**
 文件复制
 */
-(BOOL)fileManager:(NSFileManager *)fileManager shouldCopyItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL{
    return YES;
}
-(BOOL)fileManager:(NSFileManager *)fileManager shouldCopyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    return YES;
}
/**
 文件的连接
 */
-(BOOL)fileManager:(NSFileManager *)fileManager shouldLinkItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL{
    return YES;
}
-(BOOL)fileManager:(NSFileManager *)fileManager shouldLinkItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    return YES;
}
/**
 文件的移动
 */
-(BOOL)fileManager:(NSFileManager *)fileManager shouldMoveItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL{
    return YES;
}
-(BOOL)fileManager:(NSFileManager *)fileManager shouldMoveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    return YES;
}
/**
 文件移除
 */
-(BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error removingItemAtURL:(NSURL *)URL{
    return YES;
}
- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error removingItemAtPath:(NSString *)path{
    return YES;
}
/**
 文件连接错误
 */
- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error linkingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    return YES;
}
- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error linkingItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL {
    return YES;
}

@end

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

推荐阅读更多精彩内容