【麒麟在線講堂】Peony文件操作介紹
01 概述
本文主要介紹Peony文件管理器中的文件操作流程,及其相關(guān)的類之間的關(guān)系。
02 文件操作的框架

圖1 文件操作框架圖
文件操作類之間的關(guān)系如圖1所示:
FileOperationUtils類對文件操作進(jìn)行封裝,對外提供文件操作的接口,并通過FileOperationManager完成對文件的操作。
FileOperationManager是文件操作的管理類,負(fù)責(zé)文件操作的執(zhí)行、進(jìn)度更新、錯誤彈窗提示及其其他的一些操作。
FileOperation是具體的文件的操作,包括:創(chuàng)建、刪除、創(chuàng)建link、刪除到回收站、還原等。
progressBar進(jìn)度條提示文件操作的進(jìn)度。
errordialog錯誤提示窗口,當(dāng)存在沖突或錯誤的時候,彈出對應(yīng)的提示窗口。
other是FileOperationManager其他的一些輔助功能。
2.1 文件操作封裝類
類FileOperationUtils對文件/文件夾的基本操作做了封裝,對外提供文件/文件夾操作的接口。這些接口包括:文件/文件夾的創(chuàng)建、刪除到回收站、永久刪除、回收站的還原、創(chuàng)建link和重命名等。
在菜單或者是快捷鍵操作時就會調(diào)用該接口,比如右鍵菜單中的刪除、創(chuàng)建等。
類FileOperateUtils中的具體操作是通過FileOperationManager類具體執(zhí)行的。
2.2 文件操作管理
文件操作包括:永久刪除、刪除到回收站、還原、清空回收站、復(fù)制、移動、創(chuàng)建和重命名等。
CreateTemplateOperation類實現(xiàn)空文件/空文件夾、模板文件的創(chuàng)建功能。
FileCopyOperation類實現(xiàn)文件/文件夾的復(fù)制操作。
FileDeleteOperation類實現(xiàn)文件的永久刪除和清空回收站的功能。
FileLinkOperation類創(chuàng)建link操作。
FileMoveOperation文件/文件夾的移動操作。
FileRenameOperation完成文件/文件夾的重命名,即改變文件或者文件夾的名字。
FileTrashOperation將文件/文件夾刪除到回收站。
FileUntrashOperation將文件/文件夾從回收站還原到原來的位置。
上述的文件操作都是由FileOperationManager類進(jìn)行管理,其主要功能:文件操作執(zhí)行、進(jìn)度條更新和錯誤提示。
文件操作包括執(zhí)行、撤銷與恢復(fù),文件的具體操作既可以多線程執(zhí)行,也可以單線程執(zhí)行,執(zhí)行文件的操作是否為單線程是可以設(shè)置的,如果是單線程執(zhí)行,將會影響文件的并發(fā)操作。
文件操作進(jìn)度更新,文件操作的類將操作進(jìn)度通過信號發(fā)送給 FileOperationManager,然后轉(zhuǎn)發(fā)給進(jìn)度條,更新進(jìn)度。
錯誤提示,當(dāng)文件操作出現(xiàn)錯誤的時候,通過發(fā)送信號(errored)將錯誤信息傳遞給FileOperationManager,然后彈出提示對話框。
文件操作的執(zhí)行、撤銷和恢復(fù)是通過菜單或者快捷鍵進(jìn)行的,比如ctrl+z觸發(fā)撤銷操作,ctrl+y恢復(fù)撤銷的操作。
2.3 文件操作進(jìn)度條
文件操作的進(jìn)度條如圖2所示,它是由主進(jìn)度條、下拉按鈕和下拉進(jìn)度條組成的。

圖2 進(jìn)度條
進(jìn)度條涉及的主要類:
MainProgressBar類對應(yīng)圖2中主進(jìn)度條。
OtherButton類對應(yīng)圖2中的下拉按鈕。
ProgressBar對應(yīng)圖2中的下拉進(jìn)度條,目前程序限制最多可以顯示2個下拉進(jìn)度條。
FileOperationProgressBar負(fù)責(zé)進(jìn)度條的管理,主要是進(jìn)度條的布局,主進(jìn)度條進(jìn)度的更新,以及主進(jìn)度條的切換等。
進(jìn)度信息的傳遞流程如圖3所示,以文件拷貝為例:
拷貝文件的gio函數(shù)g_file_copy通過回調(diào)函數(shù)發(fā)送出信號FileProgressCallback給FileOperationManager,然后觸發(fā)progressbar的槽函數(shù)updateProgress,更新對應(yīng)progressBar的進(jìn)度,同時向FileOperationProgressBar發(fā)送信號sendValue,觸發(fā)MainProgressBar的槽函數(shù)updateValue,更新主進(jìn)度條的進(jìn)度,如果現(xiàn)在主進(jìn)度條顯示的是該 progressBar 的進(jìn)度的話。

圖3 進(jìn)度信息傳遞流程
2.4 文件操作提示窗口
當(dāng)文件/文件夾操作出現(xiàn)錯誤的時候,會彈出圖4所示窗口。提示操作遇到的錯誤信息,對應(yīng)的類FileOperationErrorDialogWarning。

圖4 操作錯誤
當(dāng)操作出現(xiàn)沖突的時候,會彈出如圖5所示的窗口。該窗口會提供取消、忽略、覆蓋、備份等選擇。對應(yīng)的類FileOperationErrorDialogConflict。

圖5 操作沖突
沖突備份時,默認(rèn)的備份方式是在文件/文件夾名字的后面添加數(shù)字,如果不想用這種方式可以自己重命名。重命名的窗口如圖6所示,對應(yīng)的類FileRenameDialog。

圖6 重命名
下面以copy操作出現(xiàn)沖突為例說明窗口的彈出(信號的發(fā)送)流程,如圖7所示:

圖7 窗口彈出信號發(fā)送流程
當(dāng)存在文件沖突時,類FileCopyOperation會發(fā)出errored信號,F(xiàn)ileOperationManager類接收到errored信號時,會根據(jù)錯誤類型彈出沖突的窗口,并且阻塞操作流程,等待用戶做出選擇,并將選擇的結(jié)果傳遞給FileCopyOperation類。
之所以彈出的窗口會阻塞操作流程,是因為FileOperationManager注冊的槽函數(shù)具有BlockingQueuedConnection屬性。
2.5 其它
當(dāng)文件操作完成時,F(xiàn)ileOperationManager會通過FIleWatch向view/model發(fā)出目錄更新的信號,即能夠彌補(bǔ)FileWatch無法監(jiān)測到變化事件。