iOS中的文件管理(二)——文件系统可视化

上一篇文章介绍了NSFileManager的一些基本用法,那么接下来就算是晋级篇——将iOS文件/文件夹可视化。

通俗地说,就是对手机中的文件进行管理,显示在tableView(列表模式)或者collectionView(大图标模式)中。

在此之前,除了必须掌握NSFileManager相关的API必须掌握,还有一个东西需要了解:

一、iOS中的沙盒机制

相关教程网上很多,不在赘述,主要介绍需要用到的几个方法:

  1. 获取document目录
  • 刚使用苹果手机的时候,发现在手机上无法像安卓手机那样查看本地文件夹或文件。那么这次接到这个项目,需要将本机的文件展示到controller中,如何实现呢?

  • 我想到的唯一的方法是:在document中创建一个文件夹,把用户需要用的文件拷贝进去,在控制器中管理这些文件即可

//获取document的路径
NSString * documentPath =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject
  1. 在document中创建一个文件夹,方便在里面“不羁放纵”
 //在沙盒中的document目录下创建myFiles 文件夹
    NSString * myFilesPath = [documentPath stringByAppendingPathComponent:@"myFiles"];
    
    //创建文件管理器
    NSFileManager *fileManager =  [NSFileManager defaultManager];
    
    //定义一个bool变量来记录是否为一个目录
    BOOL isDir = NO;
    
    //先判断判断一个文件目录是否存在
    BOOL existed = [fileManager fileExistsAtPath:allfilesPath isDirectory:&isDir];
    
    if (!(isDir == YES && existed == YES)) {
        
        //如果不存在 或者无效 则自己创建
        [fileManager createDirectoryAtPath: myFilesPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
        //如果存在的话,可以在里面放入你想放的文件。
        利用这个方法:
         - (BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData  *)data attributes:(nullable NSDictionary *)attr;

二、文件可视化——在tableView/collectionView中展示

  1. 你需要准备一个控制器容纳两种视图:tableView和collectionView
    当然如果你只想在列表中显示,那tableView就够用了。
    两个视图都懒加载,显示一个View的时候hidden另一个。

  2. 数据源(关键)
    一个数据源可以给两个view使用。

思路:
a. 传入参数为一个文件夹的路径(一个页面显示一个文件夹的数据)
b. 使用文件属性遍历器便利这个文件夹 跳过她的子文件夹
c. 创建model 列出需要用到的属性(一般是:name,createdTime,type,size)
d. 因为文件的type属性只能区分文件夹和常规文件,所以,我们需要根据文件的后缀名来把他们区分开来。
d. 赋值给model,部分数据根据情况进行修改,最终形成一个dataArray。
封装下来就是这样:
/**
获取数据
@param path 当前所在文件夹路径
*/
-(void)setdata:(NSString *)path {

    //文件属性遍历器
    NSDirectoryEnumerator *enumerator = [XHHfileManager enumeratorAtPath:path];
    //如果有值,继续往下走
    //创建临时可变数组
    NSMutableArray *tempArray = [NSMutableArray array];
    
    //遍历属性
    NSString *fileName;
   
    while (fileName = [enumerator nextObject]) {
        NSLog(@"%@",fileName);
        //        //跳过子路径
        [enumerator skipDescendants];
        //        //去掉隐藏的系统文件
        if ([fileName isEqualToString: @"__MACOSX"]) {
            //这种东东,不显示出来最好(里面也没啥东西)
            continue;
        }
        
        //这里把文件的后缀名提取出来 给model赋值
        NSString *fileType;
        NSLog(@"%@",enumerator.fileAttributes.fileType);
        //先用系统来过滤一下文件的真实属性
        //常规文件
        if ([enumerator.fileAttributes.fileType isEqualToString:KRegularType]) {
            //文件类型,并且统一用小写
            fileType = [[fileName pathExtension] lowercaseString];
            if ([fileType isEqualToString:@""]) {
                fileType = @"未知";
            }
            
        }else if([enumerator.fileAttributes.fileType isEqualToString:KDirectoryType]) {
            //文件夹
            fileType = @"D";
        }
        
        //给model赋值
        XHHFilesModel *model = [XHHFilesModel filesModelWithDict:enumerator.fileAttributes];
        //kvc赋值之后自己再进行特殊的赋值
        model.fileName = fileName;
        model.fileType = fileType;
        model.filePath = [self.path stringByAppendingPathComponent:model.fileName];

        [tempArray addObject:model];
        
    }
  1. 显示到tableView或者collectionView之中。
    让UI换上可爱的图标,就可以很性感地展示出来啦。
    下面的我想大家都会,就不用详细介绍了。
iOS中的文件管理(二)——文件系统可视化_第1张图片
tableView展示效果
iOS中的文件管理(二)——文件系统可视化_第2张图片
collectionView展示效果
既然文件都已经很好的展示出来了,那必须要对其做一些实用性的操作,才是完整的文件管理嘛,对头!接下来的文章中我会继续分享(可视化文件操作)。

你可能感兴趣的:(iOS中的文件管理(二)——文件系统可视化)