美文网首页@IT·互联网程序员iOS Developer
iOS中的文件管理(二)——文件系统可视化

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

作者: 指尖书法 | 来源:发表于2017-04-27 09:12 被阅读240次

    上一篇文章介绍了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<NSString *, id> *)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 <XHHFilesModel *>*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换上可爱的图标,就可以很性感地展示出来啦。
      下面的我想大家都会,就不用详细介绍了。
    tableView展示效果 collectionView展示效果
    既然文件都已经很好的展示出来了,那必须要对其做一些实用性的操作,才是完整的文件管理嘛,对头!接下来的文章中我会继续分享(可视化文件操作)。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/pokizttx.html