美文网首页iOS Developer程序员
iOS中的文件管理(三)——文件操作可视化

iOS中的文件管理(三)——文件操作可视化

作者: 指尖书法 | 来源:发表于2017-04-27 13:07 被阅读122次

上篇文章介绍了如何实现文件在tableView和collectionView中的显示,还有许多细节方面的东西有待补充。本文主要介绍如何实现对文件操作的可视化。

基本的编辑

对文件的编辑无外乎这几样:新建、删除、复制、剪切、粘贴、重命名。当然,又分为两种情况,单个文件操作与多个文件操作。这些方法都比较简单,直接上代码:

一、新建

  • 新建文件夹
    在这里我建议直接通过一个带有输入框的alertView来帮助用户新建文件夹


    alert弹窗新建文件夹

    还有些细节需要注意:

  • 重名问题
  • 文本输入的时候用户自己加了个点带个后缀
    在这里只作为提醒,具体解决方法,我会在细节部分详细列出来

代码:

//新建文件夹
//弹出一个输入框
UIAlertController *addFiles = [UIAlertController alertControllerWithTitle:@"请输入文件夹名" message:nil preferredStyle:UIAlertControllerStyleAlert];

//输入文本框
[addFiles addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    
}];
UIAlertAction *finished = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
    if (addFiles.textFields.firstObject.text.length == 0) {
        [SVProgressHUD showErrorWithStatus:@"文件夹名不能为空哦"];
        return ;
    }
    //不为空,创建文件夹
    //检查是否重名,重名就改名
    NSString *dirName = [NSString changeFileNameWithCurrentPath:self.path FileName:addFiles.textFields.firstObject.text];
    NSString *path = [self.path stringByAppendingPathComponent:dirName];
    [XHHfileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
    //通知当前文件夹刷新tableView
    [self setdata:self.path];
    [self.tableView reloadData];
    [self.collectionView reloadData];
}];


UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
    
}];

[addFiles addAction:finished];
[addFiles addAction:cancel];
[self presentViewController:addFiles animated:YES completion:nil];

  • 新建文本文件
    点击按钮以后跳转到一个textView页面,输入标题和内容,创建text文本文件。
    通过这个方法来保存文本为一个txt格式的文件
    当然要注意的细节仍然是重名问题
NSString *fileName = [NSString stringWithFormat:@"%@.txt",self.textTitle.text];
    [self.atextView.text writeToFile:[self.path stringByAppendingPathComponent:fileName] atomically:YES encoding:NSUTF8StringEncoding error:nil];
  • 至于其他文件,图片、视频、PDF文档、zip解压包等等,这些会在以后单独分享出来

二、删除

注意检查文件是否存在
注意统一使用多文件删除的方式

if (self.selectArray.count <1) {
        [SVProgressHUD showErrorWithStatus:@"至少选择一个文件!"];
    }
    for (XHHFilesModel *model in self.selectArray) {
        NSString *filePath = [self.path stringByAppendingPathComponent:model.fileName];
//这是关键方法
        [XHHfileManager removeItemAtPath:filePath error:nil];
    }
    //刷新数据的时候会自动清除选中的项
    [self refreshData];

三、重命名

此方法同样使用一个alert弹窗来重新设置名字
重名名方法相当于移动文件到新的路径
这个方法根据具体情况,可以集体重命名,当然重复的名字后面要加数字后缀
有个细节需要处理:在文本框显示文件名,同时光标移到后缀之前,并选中文件名字

//重命名
-(void)ChangeFilesName {

    if (self.selectArray.count < 1 ) {
        return;
    }
    
    //取出文件名
    NSString *fileName = self.selectArray.firstObject.fileName;
    NSLog(@"%@",fileName);
    //弹出一个输入框
    UIAlertController *addFiles = [UIAlertController alertControllerWithTitle:@"请输入文件名" message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    //输入文本框
    [addFiles addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.text = fileName;
    }];
    UIAlertAction *finished = [UIAlertAction actionWithTitle:@"重命名" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        
        
        if (addFiles.textFields.firstObject.text.length == 0) {
            [XHHSVProgressHUD showErrorWithStatus:@"文件名不能为空哦"];
            return ;
        }
        NSMutableArray *filesNames  = [NSMutableArray array];
        [self.selectArray enumerateObjectsUsingBlock:^(XHHFilesModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            //不为空,重命名
            NSString *path = [self.path stringByAppendingPathComponent:obj.fileName];
            
            //指向文件目录
            NSLog(@"%@", addFiles.textFields.firstObject.text);
            //修改后的名字加上文件后缀
            NSString *fileNameBefore = addFiles.textFields.firstObject.text;
            NSString *fileName2 = [NSString changeFileNameWithCurrentPath:self.path FileName:fileNameBefore];
            
            NSString *filePath2= [self.path stringByAppendingPathComponent:fileName2];
            
            //重命名的本质就是移动
            [XHHfileManager moveItemAtPath:path toPath:filePath2 error:nil];
            [filesNames addObject:fileName2];

        }];
        
        //通知当前文件夹刷新tableView
        [self selectTheNewFilesCellWithFilesNameArray:filesNames];
        
    }];
    [addFiles addAction:finished];
    [self presentViewController:addFiles animated:YES completion:nil];

}
重命名

四、复制、剪切、粘贴

这三个方法关联性强,也是一个小难点。
普通的一个文件从一个地方复制到同一个文件夹很好解决,那从一个文件夹复制到另一个呢?
因为一个页面就代表一个文件夹,所以两个不同文件夹会通过push按钮到不同文件夹
这就在可视化操作中相当于跨控制器操作,我的解决方法是:

  1. 用个人偏好设置来储存需要复制的文件数量、复制还是剪切属性、复制的文件路径 这三个方面。
  2. 在粘贴的时候读取key对应的值
  3. 粘贴完成后清空属性(当然在复制之前也做清空操作)

复制相关的代码(剪切的代码类似):

//这里再强调一下,因为复制粘贴都是全局的,不限控制器的,所以把需要复制或移动的文件信息存储到个人偏好设置中去
    //复制
    //确保最少选择一个
    if (self.selectArray.count<1) {
        [SVProgressHUD showErrorWithStatus:@"最少要选择一个文件哦"];
        [self.selectArray removeAllObjects];
        return;
    }
    //记录在个人偏好设置里
    //是复制就存copy ,是移动,就存move
    [XHHUserDefaults setObject:@"copy" forKey:MoveCopy];
    [XHHUserDefaults setObject:@(self.selectArray.count) forKey:numMoveCopy];
    
    
    for (int i = 0; i < self.selectArray.count ; i++ ) {
        
        NSString *path = [self.path stringByAppendingPathComponent:self.selectArray[i].fileName];
        
        //复制的内容不止一个,所以key键后面加数字区分
        [XHHUserDefaults setObject:path forKey:[NSString stringWithFormat:@"%@%d",copyItem,i]];
        
    }
    [self.selectArray removeAllObjects];

粘贴相关的代码:

-(void)pasteFiles {
    //粘贴
    //确保最少选择一个
    NSInteger theNumOfPast = 0;
    NSMutableArray *fileNames = [NSMutableArray array];
    if ([[XHHUserDefaults valueForKey:MoveCopy] isEqualToString:@"copy"]) {
        //复制
        //复制数量
        NSInteger num = [[XHHUserDefaults valueForKey:numMoveCopy] integerValue];
        theNumOfPast = num;
        for (int i = 0; i < num ; i++ ) {
            
        NSLog(@"%@",[XHHUserDefaults valueForKey:[NSString stringWithFormat:@"%@%d",copyItem,i]]);
            
            //取出复制或移动之前的path
            NSString *path = [XHHUserDefaults valueForKey:[NSString stringWithFormat:@"%@%d",copyItem,i]];
            //检查是否重名
            
            NSString *fileNameBefore = [NSString changeFileNameWithCurrentPath:self.path FileName:[path lastPathComponent]];
            NSString *fileName = [NSString changeFileNameWithCurrentPath:self.path FileName:fileNameBefore];
            [XHHfileManager copyItemAtPath:path toPath:[self.path stringByAppendingPathComponent:fileName] error:nil];
            NSLog(@"%@",self.path);
            NSLog(@"%@",[self.path stringByAppendingPathComponent:fileName]);
            
            [fileNames addObject:fileName];

            
            
        }
        
    }else if ([[XHHUserDefaults valueForKey:MoveCopy] isEqualToString:@"move"]) {
        
        //复制
        //复制数量
        NSInteger num = [[XHHUserDefaults valueForKey:numMoveCopy] integerValue];
        theNumOfPast = num;
        for (int i = 0; i < num ; i++ ) {
            //取出复制或移动之前的path
            NSString *path = [XHHUserDefaults valueForKey:[NSString stringWithFormat:@"%@%d",copyItem,i]];
            //检查是否重名
            NSString *fileName = [NSString changeFileNameWithCurrentPath:self.path FileName:[path lastPathComponent]];;
            [XHHfileManager moveItemAtPath:path toPath:[self.path stringByAppendingPathComponent:fileName] error:nil];
            NSLog(@"%@",[self.path stringByAppendingPathComponent:[path lastPathComponent]]);
            
            [fileNames addObject:fileName];
        }
    }else {
        [SVProgressHUD showErrorWithStatus:@"请您先选择一个粘贴对象"];
        return;
    }
    
    [self selectTheNewFilesCellWithFilesNameArray:fileNames];
    
    [XHHUserDefaults setObject:@"" forKey:MoveCopy];
    [XHHUserDefaults setObject:@0 forKey:numMoveCopy];
    [self.selectArray removeAllObjects];
}

复制和剪切在粘贴的时候唯一的区别就是是否删除原文件。当然二者有专门的方法可以操作,不用多说。

五、文件排序

文件的几种排序方式

这个也很重要,需要借助到一个比较器。具体方法很简单又很实用:

//按创建时间排序
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(XHHFilesModel *  _Nonnull first, XHHFilesModel *  _Nonnull second) {
                
                id firstData = first.NSFileCreationDate;
                
                id secondData = second.NSFileCreationDate;//获取后一个文件
                
                return [secondData compare:firstData];

其他的排序方式以此类推,相信难不倒聪明的你。

可视化菜单

当然,这一切操作的实现,都要通过一个具体的菜单来呈现,我用的是一个三方库CommonMenuView,实现起来很简单,而且能够根据手指所点的位置显示出菜单,很不错,有空的时候我会好好分析一下源码,自己模仿着做一个。

//一个方法创建菜单:
[CommonMenuView createMenuWithFrame : CGRectZero
                                 target : self.navigationController
                              dataArray : Array
                        itemsClickBlock : ^(NSString *str, NSInteger tag) {  [weakSelf doSomething:(NSString *)str tag:(NSInteger)tag];  }
                            backViewTap : ^{  /* 点击背景遮罩view后的block,可自定义事件 */
                            
                                [self.selectArray removeAllObjects];
                            }];

效果:

pop菜单

相关文章

  • iOS中的文件管理(三)——文件操作可视化

    上篇文章介绍了如何实现文件在tableView和collectionView中的显示,还有许多细节方面的东西有待补...

  • iOS逆向(二)-系统文件层次结构介绍

    可视化方式查看iOS系统文件可视化查看app系统文件方式很多== 在iOS通过Cydia安装Apple File ...

  • iOS 文件管理,文件操作小结

    一、iOS中的沙盒机制 •iOS应用程序只能对自己创建的文件系统读取文件,这个独立、封闭、安全的空间,叫做沙盒。它...

  • 3. iOS文件系统结构

    iOS文件系统结构 可视化方式查看iOS系统文件在iOS通过Cydia安装Apple File Conduit 2...

  • IOS文件管理

    iOS开发-文件管理(一) 一、iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立、封闭...

  • iOS文件管理

    iOS开发-文件管理(一) 一、iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立、封闭...

  • iOS逆向课程笔记(二)

    3.iOS文件系统结构 可视化方式常看iOS系统文件==在iOS通过Cydia安装Apple File Condu...

  • 文件与流

    文件 作用:对文件的管理,在程序里操作硬盘的文件和文件夹概述:通过IO包中的File类实现对文件的管理功能:文件的...

  • 文件系统

    在Linux操作系统中,文件的概念包括文件的组织和管理、操作系统中文件的表示,以及文件存储的过程等。 一、文件系统...

  • OSS-09-文件系统

    1、文件系统是操作系统中管理和存取文件的软件机构,由负责文件操作和管理的程序模块、所需的数据结构、以及访问文件的一...

网友评论

    本文标题:iOS中的文件管理(三)——文件操作可视化

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