摘 ?要:在VS2010開發(fā)平臺上以MFC基于對話框為開發(fā)框架,實現(xiàn)對指定目錄路徑的自動保存,并在該路徑下根據(jù)選擇的文件類型,進行快速檢索的功能。實現(xiàn)邏輯為讀取EDIT控件上的路徑,然后調(diào)用MFC基類CFileFind的成員函數(shù),遍歷該路徑下的所有文件,并將文件名等相關數(shù)據(jù)同步到Report格式的List控件中,最后通過鼠標雙擊響應函數(shù)來調(diào)用系統(tǒng)API函數(shù)ShellExecute()打開指定文件。
關鍵詞:MFC;List控件;遍歷;軟件開發(fā);文件查找
中圖分類號:TP311.5 ? ? 文獻標識碼:A
Abstract:In Visual Studio 2010 platform,use dialog-based MFC as developing frame,to realize the auto-saving of the specified path to configurate file and quick search in accordance with the selected file types through such path.After reading the path of Edit Control,call member function of CFileFind Class to traverse all files under that path,then copy file names and other related data to list control in LVS_REPORT Mode.Lastly call the ShellExecute API function on the MouseEvent function with Double-Clicking to open selected file by ShellExecute().
Keywords:MFC;List control;traversal;software development;file search
1 ? 引言(Introduction)
MFC(Microsoft Foundation Classes)是微軟公司開發(fā)的具有圖形界面的C/C++基礎類庫,封裝了大部分的Windows API函數(shù)。通過VS2010(Microsoft Visual Studio 2010)一個集成的開發(fā)環(huán)境,在該平臺上新建一個MFC的工程,會自動生成相應的程序文件及外部庫文件等。由于該應用程序框架提供了大量的Windows句柄封裝類,以及控件、組件的封裝類,就大大提高了軟件的開發(fā)效率,使軟件工程師可以把更多的精力放在算法及邏輯的實現(xiàn)上。同時因具備圖形化操作界面,使用戶可以快速適應并掌握軟件的使用技巧[1]。
2 開發(fā)該軟件的必要性(The necessity of thesoftware development)
隨著辦公文件的不斷增加,如我校圖書館采編部由于需要整理查找大量的圖書相關數(shù)據(jù),導致整個桌面幾乎都被excel文件占據(jù),最終影響了用戶的正常操作。對于在工作中需處理大量文件的工作人員而言,如果能快速有效地找到并打開目標文件將極大地提高工作效率[2]。雖然Windows系統(tǒng)自帶了文件搜索功能,但因其功能有限,實際使用中并不能很有效的解決用戶所遇到的問題,因此需要開發(fā)一款符合用戶實際操作需求,用于文件查找的專業(yè)軟件。
3 ?Windows系統(tǒng)搜索功能的局限性(Limitations ofthe search function of Windows OS)
3.1 ? 無法自動保存查找的路徑
用戶一般會事先將相關文件放置在同一目錄下,而系統(tǒng)自帶的搜索功能由于無法對上次搜索的目錄進行記憶,只要系統(tǒng)重啟或者文件查找框被關閉后就需要重新輸入目錄,才能在指定目錄下進行文件的查找,即存在重復的操作,降低了用戶的使用體驗。
3.2 ? 不能針對某種文件類型查找
由于使用習慣或者用途的不同,目前使用最多的是Excel、Word、txt等常用類型文件,用戶往往希望能指定某種文件類型進行查找,而系統(tǒng)自帶的搜索功能卻又無法針對某種或幾種類型進行專門查找,只能盲目地將所有包含該關鍵字的文件都進行查找導致查找效率降低。
3.3 ? 缺少關鍵字模糊查找功能
目前,Windows系統(tǒng)僅支持關鍵字100%匹配度的查找法,即前后字符順序必須完全匹配才行,但實際操作過程中,用戶并非完全能保證前后順序的正確性,甚至不確定是否有這些關鍵字,這種情況下就對用戶的查找增加了難度。
4 開發(fā)該軟件的整體框架和布局(The overallframework and layout of the software development)
在微軟推出的VS2010開發(fā)平臺上進行MFC基于對話框的軟件開發(fā),利用自動生成的MFC類庫可快速完成整個MFC程序的軟件框架搭建,通過自帶且功能強大的控件功能,不僅快速完成桌面的布局,且由于MFC封裝的很淺,通過繼承基類,及調(diào)用外部庫文件函數(shù),可根據(jù)自身功能需求完成子類控件及功能類的二次開發(fā)。開發(fā)語言使用C++進行編寫[3],利用VS2010集成開發(fā)環(huán)境提供的調(diào)試和編譯環(huán)境,不斷進行測試和錯誤追蹤,逐步地完成所有功能的開發(fā)。在界面的布局上,利用MFC編程的可視化操作[4],對各控件的布局進行科學合理的優(yōu)化,最大限度地實現(xiàn)文件的高效查找目標。
4.1 ? 源文件及資源視圖設計
源文件無疑是整個程序最重要的可執(zhí)行文件,也是軟件開發(fā)人員編寫代碼的地方。其中外部依賴庫是已經(jīng)封裝好功能強大的代碼庫,對于開發(fā)人員而已,只需包含調(diào)用即可。因此開發(fā)與設計的重點在于頭文件類成員變量與函數(shù)的聲明及源文件的邏輯設計。該軟件的頭文件主要有:FileSearchTool.h與FileSearchToolDlg.h,源文件主要有:FileSearchTool.cpp與FileSearchToolDlg.cpp,資源視圖文件主要是FileSearchTool.rc。頭文件主要用于聲明各控件類對象、成員變量及成員函數(shù)等。而源文件負責所有程序的執(zhí)行流程,主要包括文件路徑的讀寫、指定路徑下的文件查找及各個控件的響應函數(shù)等。資源視圖界面則負責軟件整個窗口及各控件的布局,其中Edit控件主要有檢索目錄輸入框、文件名關鍵字輸入框及選定文件的完整路徑顯示框;Button控件主要是目錄選擇按鈕、查找按鈕;Check Box控件包括文件類型、模糊查找復選框;List控件則用于文件信息顯示列表框。根據(jù)用戶使用習慣調(diào)整各控件尺寸大小并進行合理布局[5]。
4.2 ? 靜態(tài)庫文件及Unicode字符集
為保證軟件的可移植性,以及對所有語言的支持,選擇使用靜態(tài)庫,即在程序編譯時就會被連接到目標代碼中,程序運行時就不再需要該靜態(tài)庫,保證在其他用戶電腦中也能正常使用。而動態(tài)庫則是在程序運行時才被載入,程序運行時就一直需要動態(tài)庫文件的存在,因此不利于程序的移植。同時為保證程序的跨語言、跨平臺,實現(xiàn)對多國語言支持,選擇Unicode字符集,使字符在不同的語言系統(tǒng)環(huán)境上仍能正常顯示不出現(xiàn)亂碼,解決了傳統(tǒng)字符編碼方案的局限性[6]。
4.3 ? 文件查找功能實現(xiàn)邏輯
遍歷指定目錄下的所有文件,根據(jù)選定的文件類型,找到含有關鍵字的文件,并將該文件的名稱、路徑等信息全部插入到List控件中,然后根據(jù)先后順序?qū)⒎喜檎覘l件的文件名從上往下逐行排列顯示。最后用戶通過鼠標雙擊目標文件名的方式來快速打開文件。除此之外,為保證軟件的實用性特意增加了模糊查找等功能。
5 各個功能模塊的編程實現(xiàn)(Programmingimplementation of each functional module)
5.1 ? 目錄選擇按鈕
用于用戶手動選擇所需要的檢索目錄,通過鼠標單擊彈出瀏覽文件夾對話框,根據(jù)目錄選擇指定的文件夾。獲取的路徑信息將賦值給成員變量m_strPath,用于保存指定路徑的信息。實現(xiàn)方法為:首先定義BROWSEINFO結構體變量,然后給該變量的各個成員變量賦值,主要是標題、窗口樣式等,再調(diào)用::SHBrowseForFolder()函數(shù)打開文件夾選擇對話框,最后使用::SHGetPathFromIDList()函數(shù)獲取選擇的目錄路徑。
5.2 ? 檢索目錄輸入框
該Edit控件負責顯示要查找的目錄路徑,執(zhí)行查找功能后會將該路徑寫入到配置文件中,實現(xiàn)每次打開軟件后自動讀取配置文件中的數(shù)據(jù),通過對配置文件進行讀寫操作,節(jié)約了輸入路徑或者目錄選擇的時間。具體實現(xiàn)步驟為:首先定義CFile類對象file,接著調(diào)用該對象的文件類操作函數(shù)file.Open(_T("filepath.txt"),CFile::modeCreate|CFile::modeReadWrite)函數(shù),配置文件打開成功后再執(zhí)行寫操作:file.Write()和讀操作:file.ReadString()[7]。
5.3 ? 文件類型判斷功能
文件類型主要分為Excel、Wrod、txt及其他類型,通過調(diào)用Check-box控件的消息響應函數(shù)來判斷選擇的文件類型,用戶根據(jù)目標文件類型可進行單選或多選。如下圖所示通過只輸出選定類型的文件名信息,檢索出來的文件數(shù)量就大大減少,提高了查找效率。實現(xiàn)方法為:首先定義CFileFind 類對象find,然后獲取文件擴展名的前三個字符CString strFileType=find.GetFileName().Mid(find.GetFileName().Find(_T("."))+1,3),最后與選定的文件擴展名前三個字符進行比較:if((0==iChkBox[0]&&_T("xls")== strFileType))。
5.4 ? 關鍵字與模糊查找功能
關鍵字查找顧名思義,是將關鍵的字符與所有的文件名進行逐一匹配,一旦含有該關鍵字就將該文件名進行輸出。關鍵字查找是所有數(shù)據(jù)庫檢索系統(tǒng)都必備的功能,本軟件將在該功能基礎上再研發(fā)出模糊查找的功能,是一種不需要關鍵字前后順序必須一致,且所有字符都匹配,仍能將具有一定匹配度的文件名進行輸出的算法。實現(xiàn)邏輯為根據(jù)關鍵字的總字符數(shù),從左至右依次取一個字符循環(huán)判斷文件名中是否存在該字符,若存在就使成員變量iMatchNum自增,最后若自增值大于等于總字符數(shù)的50%以上就認為匹配,輸出該文件名。通過使用該功能極大地提高了關鍵字查找成功率。核心代碼與效果圖,如圖6所示。
5.5 ? 列表控件信息顯示及雙擊事件
單擊界面查找按鈕來執(zhí)行文件查找時,通過調(diào)用函數(shù):m_list.InsertItem(iCount,strCount)與m_list.SetItemText(iCount,1,find.GetFileName()),將每個符合條件的文件信息(序號、文件名、文件路徑)逐行插入到List控件中,并以Report風格顯示,實現(xiàn)類似于Excel表的功能,方便用戶快速瀏覽文件信息,然后通過響應鼠標雙擊事件,獲取目標文件完整路徑然后調(diào)用ShellExecute(NULL,_T("open"),strSelectFile,NULL,NULL,SW_SHOWNORMAL)函數(shù)來打開。
5.6 ? 整個窗口及控件大小可變
為進一步提高用戶對軟件的使用體驗,實現(xiàn)通過鼠標自由拉伸改變軟件及控件的大小,以滿足用戶特殊情況下的使用需求。與窗口一同拉伸或移動的控件有檢索目錄輸入框、完整路徑顯示框、列表控件及目錄選擇按鈕。通過響應消息處理函數(shù)OnSize(),實時調(diào)整窗體及相關控件的大小與位置。定義CRect結構體變量rec,以及Cwnd類的指針變量*pWnd使指向目標控件,然后獲取目標控件的大小pWnd->
GetWindowRect(&rec),再轉(zhuǎn)換為在對話框中的區(qū)域坐標ScreenToClient(rec),再根據(jù)變化后的窗體大小,實時修改rec結構體變量的值,最后執(zhí)行pWnd->MoveWindow(rec)修改目標控件的大小及位置。
6 ? 結論(Conclusion)
利用MFC基于對話框的文件查找軟件開發(fā),通過強大的類庫功能、合理的代碼邏輯設計及界面控件的布局,為廣大用戶提供了一種新的專業(yè)文件查找工具,有效地彌補了Windows系統(tǒng)自帶文件搜索功能的不足,進一步提高了查找的效率及成功率。
為進一步滿足不同用戶使用需求,提高軟件的實用性,需要不斷完善該軟件的功能,如增加文件內(nèi)容的關鍵字查找,以及顯示查找進度等功能。
參考文獻(References)
[1] 譚振江,朱冰,逯洋.基于MFC的隨機點名系統(tǒng)設計與實現(xiàn)[J].吉林師范大學學報(自然科學版),2018,39(01):110-115.
[2] 水疙瘩.善用Windows 7搜索讓查找效率更高找[J].個人電腦,2012,18(03):94-96.
[3] 譚浩強.C++程序設計(第2版)[M].北京:清華大學出版社,2011.
[4] 董榮偉,姚月琴,陶冶,等.基于VC++智能糧庫環(huán)境參數(shù)監(jiān)控軟件設計[J].河北農(nóng)機,2018(01):19.
[5] 鄭阿奇,丁有和,鄭進,等.Visual C++實用教程(第3版)[M].北京:電子工業(yè)出版社,2007.
[6] 張馳.基于C++語言的跨平臺軟件開發(fā)的設計與實現(xiàn)[D].北京:北京交通大學,2010.
[7] 陳秀川,楊云,郭琦.對VC~(++)MFC類庫中CFile類的派生類的研究和示例[J].南昌航空工業(yè)學院學報(自然科學版),2004(04):76-80;84.
作者簡介:
李傳可(1985-),男,碩士,助理館員.研究領域:軟件開發(fā),人工智能.