劉潔 李青元 石元會
摘要:源代碼匯總在軟件項目的項目管理、測試、驗收等環(huán)節(jié)都可發(fā)揮重要的作用。本文提出開發(fā)一個軟件源代碼匯總工具的必要性,給出了軟件的設(shè)計思路、模塊劃分、用C++實現(xiàn)的關(guān)鍵語句,以及輸出成WORD格式文檔的顯示效果。
關(guān)鍵詞:源代碼匯總;軟件項目管理;C++;軟件實現(xiàn);WORD格式
中圖分類號:TP311.53? ? 文獻標(biāo)識碼:A? ? ?文章編號:1007-9416(2018)09-0000-00
1 引言
一個軟件項目的源文件一般都在某一目錄及其子目錄下。源代碼匯總是指對一個軟件項目所涉及到的所有源代碼文件的文件名稱、字節(jié)數(shù)、日期進行匯總統(tǒng)計,并將源代碼的文件內(nèi)容匯總到一個文件的處理過程。源代碼匯總在軟件開發(fā)的項目管理、測試、驗收等環(huán)節(jié)都可發(fā)揮重要的作用。該功能稍加擴展還可實現(xiàn)對用戶個人的信息管理與查找,例如可據(jù)某一關(guān)鍵字如以收索某一目錄下的所有文件看看它在哪些文件中出現(xiàn)過。
目前市場上源代碼統(tǒng)計工具較為代表性的軟件有Boom Works公司開發(fā)的source counter軟件,但是其也具有一定的局限性,下幾點:
(1)只有文件信息的清單以及對代碼的分析,無法將所有的源代碼文件以一定的格式匯總到一個文件中,例如如圖1所示。
(2)所有的輸出只支持excel、HTML兩種格式;
(3)部分功能較為冗余,例如其中對代碼工作量的分析在實際中很少用到,而且其參考價值也不大。
另外還有其他一些統(tǒng)計工具,功能與source counter類似,也都沒法匯總源代碼文件到一個文件中,也更無法輸出到word中[1-2],所以筆者認(rèn)為寫一款既能統(tǒng)計文件清單又能匯總源代碼的源代碼匯總工具很有必要。
2 設(shè)計思路
源代碼匯總工具軟件的設(shè)計理念是小巧、精悍、界面簡潔,讓用戶可以在很短的時間內(nèi)學(xué)會使用,軟件的設(shè)計目標(biāo)有兩個,分別是:以word表格的形式輸出任意個文件夾下所有文件的文件清單,清單中的文件基本信息包括文件序號、所在目錄、文件名、文件大小、修改日期,其中前兩項可以選擇輸出;另外一個目標(biāo)是以word形式匯總所有源代碼并輸出,并要求以文件名生成目錄,也可以選擇是否輸出序號、所在目錄。
3 軟件的系統(tǒng)設(shè)計
該源代碼管理工具采用C++語言、visual studio 2013為開發(fā)平臺開發(fā),主要是針對以文本格式編寫的任何源文件進行統(tǒng)計、匯總,支持ANSI、UTF-8、UTF-16三種編碼格式的源文件,對源文件的后綴名稱不做區(qū)分,只要編碼方式滿足要求即可。系統(tǒng)的設(shè)計流程圖如圖2所示。
4 技術(shù)要點
軟件的設(shè)計中主要有四大關(guān)鍵要點,分別是:不同編碼方式的源文件讀取、文件夾中子文件夾遞歸讀取、word文件輸出、數(shù)據(jù)存儲處理;下面分開介紹這四方面。
4.1不同編碼方式的源文件讀取
軟件的源代碼以文本形式存儲,文本的存儲主要分為ANSI、UTF-8、UTF-16這三種編碼風(fēng)格,因此在軟件中讀取的過程中就首先需要判斷源文件的編碼風(fēng)格,判斷方法主要是通過源文件中開頭的BOM標(biāo)志,沒有BOM標(biāo)志時即為ANSI編碼,無需轉(zhuǎn)換。
UTF-8 BOM標(biāo)志為0xEF、0xBB、0xBF,而且UTF-8不需要BOM來表明字節(jié)順序,無需對CPU的大端、小端情況區(qū)別對待;UTF-16 BOM標(biāo)志區(qū)分大端、小端情況,大端為0xFE、0xFF,小端則相反。
當(dāng)檢測到為UTF-8、UTF-16編碼風(fēng)格的源代碼文件時需要將讀取到的字符串轉(zhuǎn)換為ANSI風(fēng)格的字符串,筆者采用的方法是通過Windows API函數(shù):WideCharToMultiByte、MultiByteToWideChar完成UTF風(fēng)格字符轉(zhuǎn)為ANSI風(fēng)格字符串[3]。
4.2文件夾中子文件夾遞歸讀取
軟件需要做到對目標(biāo)文件夾下的所有文件的統(tǒng)計、匯總,包括目標(biāo)文件夾下的子文件夾中文件,所以在讀取到文件夾中的子文件夾時,就需要考慮對子文件夾中的文件讀取。
筆者采用的解決方案為:使用MFC中的CFileFind類對文件進行操作,當(dāng)遍歷到目標(biāo)文件夾下的文件時,進行讀取、存儲操作,若當(dāng)前文件為子文件夾時,則對子文件夾時對其進行遞歸調(diào)用。另外需要注意在Dos系統(tǒng)下,每個目錄下都有兩個缺省的目錄,分別為“.”與“..”,它們各自代表本層目錄與上一層目錄,所以在遍歷文件夾中文件時需要將這兩者過濾掉[4-9]。
4.3 word文件輸出
Word文件的輸出最為重要,對于操作word筆者采用OLE/COM技術(shù), OLE全稱為Object Linking and Embedding,這項技術(shù)是由微軟提出的一種面向?qū)ο蟮募夹g(shù),通過它可以開發(fā)可重復(fù)使用的組件,本程序就是利用微軟留下的這些接口實現(xiàn)對word進行操作。
首先確保MFC程序創(chuàng)建支持自動化,然后打開Office的安裝目錄,找到MSWORD.OLD文件,導(dǎo)入Office中的類庫,即可自動生成與word操作所對應(yīng)的類與文件,此處需要將每個頭文件中的#import "E:\\TTMv8\\Debug\\MSWORD.OLB" no_namespace部分注釋掉,之后利用vs生成的類將word的操作封裝為一個WordClass類,實現(xiàn)創(chuàng)建文檔、保存文檔、輸出文字、輸出標(biāo)題、輸出頁數(shù)、創(chuàng)建表格、在表格中輸出指定文字功能,在使用時直接由WordClass的類對象直接調(diào)用即可。其中關(guān)鍵性代碼如下:
(1)創(chuàng)建服務(wù)器連接(BOOL CreateAPP())
m_app.CreateDispatch(_T("Word.Application"));
(2)創(chuàng)建word文檔(BOOL CreateDocument())
m_docs = m_app.get_Documents();
COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_doc = m_docs.Add(vOpt, vOpt, vOpt, vOpt);
m_sel = m_app.get_Selection();
(3)保存文檔(BOOL SaveAs(CString FileName, int SaveType = 0))
m_doc.SaveAs(&cFileName,&FileFormat,&vFalse,COleVariant(_T("")), &vTrue,COleVariant(_T("")), &vFalse, &vFalse, &vFalse, &vFalse, &vFalse, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt);
其中FileName參數(shù)為保存文件的路徑。
(4)創(chuàng)建表格(void CreateTable(int Row, int Column))
CComVariant DefaultBehavior(1), AutoFitBehavior(2);
m_tabs.Add(m_sel.get_Range(), Row, Column, &DefaultBehavior, &AutoFitBehavior);
創(chuàng)建Row行Column列的表格。
(5)在表格中輸出(void WriteCellText(int Row, int Column, CString Text))
CCell c = m_tab.Cell(Row, Column);
c.Select();
m_sel.TypeText(Text);
在第Row行第Column列輸出Text。
(6)輸出標(biāo)題(void WriteTile(CString title, CString fontName = _T("微軟雅黑"), int fontSize = 16, unsigned int level = 2))
m_sel.TypeText(title);
m_sel.HomeKey(COleVariant((short)5), COleVariant((short)1));
m_sel.put_Style(COleVariant((short)-level));
設(shè)置title為標(biāo)題,其中l(wèi)evel:為1時輸出正文,為2輸出一級標(biāo)題,為3輸出二級標(biāo)題,并以此類推。
(7)輸出正文(void WriteText(CString Text))
m_sel.TypeText(Text);
(8)設(shè)置頁碼(void WritePageNum())
m_sel.get_ParagraphFormat().put_Alignment(1);? ? 設(shè)置對齊方式為居中;
m_sel.TypeText(_T("/"));
m_sel.MoveLeft(COleVariant((short)1),COleVariant((short)1), &covZero);
CFields fields = m_sel.get_Fields();
fields.Add(m_sel.get_Range(),COleVariant((short)33),COleVariant(_T("PAGE? ")), &covTrue);
輸出當(dāng)前頁碼;
m_sel.MoveRight(COleVariant((short)1),COleVariant((short)1), &covZero);
fields.Add(m_sel.get_Range(), COleVariant((short)26), COleVariant(_T("NUMPAGES? ")), &covTrue);
輸出總頁碼數(shù);
oView.put_SeekView(0);
關(guān)閉頁眉頁腳。
4.4數(shù)據(jù)存儲處理
讀取文件筆者是通過MFC CFile類方法實現(xiàn)。
獲取文件信息用GetStatus()函數(shù)可獲取文件日期信息,GetLength()函數(shù)用來獲取文件大小信息。對于文件基本信息的存儲,用一個結(jié)構(gòu)體FileInformation來存放,F(xiàn)ileInformation結(jié)構(gòu)體代碼如下:
struct _fileInformation
{
public:
unsigned int m_Num;
CString m_Name;
CString m_Path;
float m_Size;
unsigned int m_RowNum;
CString m_Function;
CString m_Data;
public:
_fileInformation();
~_fileInformation();
};
在用一個容器存放FileInformation的指針,用以存放每個文件的基本信息;
對于源代碼統(tǒng)計信息,獲取完文件基本信息之后,開始正式讀取源文件的內(nèi)容,通過調(diào)用WordClass的WriteText方法將源代碼的每一行保存到WordClass對象中,讀取該文件后,直接調(diào)用SaveAs輸出。
在完成匯總輸出源代碼統(tǒng)計之后,再調(diào)用CreateDocument創(chuàng)建一個新的word,隨后創(chuàng)建表格,將文件基本信息按照格式輸出到表格中,最后輸出即可。
5 輸出效果
圖3為源代碼的文件統(tǒng)計清單效果圖,圖4為源代碼的統(tǒng)計匯總效果圖。
6結(jié)語
本軟件雖然達到了設(shè)計目標(biāo),但是距離稱為一款完善的源代碼統(tǒng)計軟件還有一定距離,例如對于源代碼文件中的注釋行統(tǒng)計、輸出其他格式的文件等,這仍需要進一步的改進和提升。
參考文獻
[1] 鄭文嬋.應(yīng)用于軟件測試的代碼統(tǒng)計系統(tǒng)的設(shè)計與實現(xiàn)[D].成都:《西華大學(xué)碩士論文》,2014年.
[2] 舒濤.基于COM技術(shù)的實體卡系統(tǒng)試卷生成技術(shù)研究[J].赤峰學(xué)院學(xué)報(自然科學(xué)版),2013,29(8):14-16.
[3] Jeffrey Richter, Christophe Nasarre著.Windows核心編程(第5版)[M].葛子昂,北京.清華大學(xué)出版社,2008.
[4] 侯俊杰. 深入淺出MFC(第2版) [M].武漢.華中科技大學(xué)出版社,2001.
[5] 孫鑫.VC++深入講解(修訂版)[M].北京.電子工業(yè)出版社,2006.
[6] Stephen Prata著.C++ Primer Plus[M].張海龍等譯,北京:人民郵電出版社,2012.
[7] 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C 語言版)[M].北京.清華大學(xué)出版社,2011.
[8] 程杰.大話數(shù)據(jù)結(jié)構(gòu)[M].北京.清華大學(xué)出版社,2011.
[9] 程杰.大話設(shè)計模型[M].北京.清華大學(xué)出版社,2010.
Design and implementation of source code summary tool
LIU Jie1,LI Qing-yuan1,2,SHI Yuan-hui3
(1.College of Geoscience and Surveying Engineering, China University of Mining and Technology (Beijing), Beijing 100083;
2.Key Laboratory of Geo-Informatics, Chinese Academy of Surveying and Mapping, Beijing 100830;
3.Logging Corp., Sinopec Jianghan Petroleum Engineering Company,Qianjiang, Hubei 433123)
Abstract: The source code summary software plays an important role in the management, testing, and acceptance of software projects. This paper proposes the necessity of developing a software source code summary tool, and gives the software design ideas, module division, key statements implemented in C++, and the display effect of the output as a WORD format document.
Keywords: source code summary, software project management, C++, software implementation, WORD format