【麒麟在线讲堂】Peony文件操作介绍
01 概述
本文主要介绍Peony文件管理器中的文件操作流程,及其相关的类之间的关系。
02 文件操作的框架
图1 文件操作框架图
文件操作类之间的关系如图1所示:
FileOperationUtils类对文件操作进行封装,对外提供文件操作的接口,并通过FileOperationManager完成对文件的操作。
FileOperationManager是文件操作的管理类,负责文件操作的执行、进度更新、错误弹窗提示及其其他的一些操作。
FileOperation是具体的文件的操作,包括:创建、删除、创建link、删除到回收站、还原等。
progressBar进度条提示文件操作的进度。
errordialog错误提示窗口,当存在冲突或错误的时候,弹出对应的提示窗口。
other是FileOperationManager其他的一些辅助功能。
2.1 文件操作封装类
类FileOperationUtils对文件/文件夹的基本操作做了封装,对外提供文件/文件夹操作的接口。这些接口包括:文件/文件夹的创建、删除到回收站、永久删除、回收站的还原、创建link和重命名等。
在菜单或者是快捷键操作时就会调用该接口,比如右键菜单中的删除、创建等。
类FileOperateUtils中的具体操作是通过FileOperationManager类具体执行的。
2.2 文件操作管理
文件操作包括:永久删除、删除到回收站、还原、清空回收站、复制、移动、创建和重命名等。
CreateTemplateOperation类实现空文件/空文件夹、模板文件的创建功能。
FileCopyOperation类实现文件/文件夹的复制操作。
FileDeleteOperation类实现文件的永久删除和清空回收站的功能。
FileLinkOperation类创建link操作。
FileMoveOperation文件/文件夹的移动操作。
FileRenameOperation完成文件/文件夹的重命名,即改变文件或者文件夹的名字。
FileTrashOperation将文件/文件夹删除到回收站。
FileUntrashOperation将文件/文件夹从回收站还原到原来的位置。
上述的文件操作都是由FileOperationManager类进行管理,其主要功能:文件操作执行、进度条更新和错误提示。
文件操作包括执行、撤销与恢复,文件的具体操作既可以多线程执行,也可以单线程执行,执行文件的操作是否为单线程是可以设置的,如果是单线程执行,将会影响文件的并发操作。
文件操作进度更新,文件操作的类将操作进度通过信号发送给 FileOperationManager,然后转发给进度条,更新进度。
错误提示,当文件操作出现错误的时候,通过发送信号(errored)将错误信息传递给FileOperationManager,然后弹出提示对话框。
文件操作的执行、撤销和恢复是通过菜单或者快捷键进行的,比如ctrl+z触发撤销操作,ctrl+y恢复撤销的操作。
2.3 文件操作进度条
文件操作的进度条如图2所示,它是由主进度条、下拉按钮和下拉进度条组成的。
图2 进度条
进度条涉及的主要类:
MainProgressBar类对应图2中主进度条。
OtherButton类对应图2中的下拉按钮。
ProgressBar对应图2中的下拉进度条,目前程序限制最多可以显示2个下拉进度条。
FileOperationProgressBar负责进度条的管理,主要是进度条的布局,主进度条进度的更新,以及主进度条的切换等。
进度信息的传递流程如图3所示,以文件拷贝为例:
拷贝文件的gio函数g_file_copy通过回调函数发送出信号FileProgressCallback给FileOperationManager,然后触发progressbar的槽函数updateProgress,更新对应progressBar的进度,同时向FileOperationProgressBar发送信号sendValue,触发MainProgressBar的槽函数updateValue,更新主进度条的进度,如果现在主进度条显示的是该 progressBar 的进度的话。
图3 进度信息传递流程
2.4 文件操作提示窗口
当文件/文件夹操作出现错误的时候,会弹出图4所示窗口。提示操作遇到的错误信息,对应的类FileOperationErrorDialogWarning。
图4 操作错误
当操作出现冲突的时候,会弹出如图5所示的窗口。该窗口会提供取消、忽略、覆盖、备份等选择。对应的类FileOperationErrorDialogConflict。
图5 操作冲突
冲突备份时,默认的备份方式是在文件/文件夹名字的后面添加数字,如果不想用这种方式可以自己重命名。重命名的窗口如图6所示,对应的类FileRenameDialog。
图6 重命名
下面以copy操作出现冲突为例说明窗口的弹出(信号的发送)流程,如图7所示:
图7 窗口弹出信号发送流程
当存在文件冲突时,类FileCopyOperation会发出errored信号,FileOperationManager类接收到errored信号时,会根据错误类型弹出冲突的窗口,并且阻塞操作流程,等待用户做出选择,并将选择的结果传递给FileCopyOperation类。
之所以弹出的窗口会阻塞操作流程,是因为FileOperationManager注册的槽函数具有BlockingQueuedConnection属性。
2.5 其它
当文件操作完成时,FileOperationManager会通过FIleWatch向view/model发出目录更新的信号,即能够弥补FileWatch无法监测到变化事件。