劉潔 李青元 石元會



摘要:源代碼匯總在軟件項目的項目管理、測試、驗收等環節都可發揮重要的作用。本文提出開發一個軟件源代碼匯總工具的必要性,給出了軟件的設計思路、模塊劃分、用C++實現的關鍵語句,以及輸出成WORD格式文檔的顯示效果。
關鍵詞:源代碼匯總;軟件項目管理;C++;軟件實現;WORD格式
中圖分類號:TP311.53? ? 文獻標識碼:A? ? ?文章編號:1007-9416(2018)09-0000-00
1 引言
一個軟件項目的源文件一般都在某一目錄及其子目錄下。源代碼匯總是指對一個軟件項目所涉及到的所有源代碼文件的文件名稱、字節數、日期進行匯總統計,并將源代碼的文件內容匯總到一個文件的處理過程。源代碼匯總在軟件開發的項目管理、測試、驗收等環節都可發揮重要的作用。該功能稍加擴展還可實現對用戶個人的信息管理與查找,例如可據某一關鍵字如以收索某一目錄下的所有文件看看它在哪些文件中出現過。
目前市場上源代碼統計工具較為代表性的軟件有Boom Works公司開發的source counter軟件,但是其也具有一定的局限性,下幾點:
(1)只有文件信息的清單以及對代碼的分析,無法將所有的源代碼文件以一定的格式匯總到一個文件中,例如如圖1所示。
(2)所有的輸出只支持excel、HTML兩種格式;
(3)部分功能較為冗余,例如其中對代碼工作量的分析在實際中很少用到,而且其參考價值也不大。
另外還有其他一些統計工具,功能與source counter類似,也都沒法匯總源代碼文件到一個文件中,也更無法輸出到word中[1-2],所以筆者認為寫一款既能統計文件清單又能匯總源代碼的源代碼匯總工具很有必要。
2 設計思路
源代碼匯總工具軟件的設計理念是小巧、精悍、界面簡潔,讓用戶可以在很短的時間內學會使用,軟件的設計目標有兩個,分別是:以word表格的形式輸出任意個文件夾下所有文件的文件清單,清單中的文件基本信息包括文件序號、所在目錄、文件名、文件大小、修改日期,其中前兩項可以選擇輸出;另外一個目標是以word形式匯總所有源代碼并輸出,并要求以文件名生成目錄,也可以選擇是否輸出序號、所在目錄。
3 軟件的系統設計
該源代碼管理工具采用C++語言、visual studio 2013為開發平臺開發,主要是針對以文本格式編寫的任何源文件進行統計、匯總,支持ANSI、UTF-8、UTF-16三種編碼格式的源文件,對源文件的后綴名稱不做區分,只要編碼方式滿足要求即可。系統的設計流程圖如圖2所示。
4 技術要點
軟件的設計中主要有四大關鍵要點,分別是:不同編碼方式的源文件讀取、文件夾中子文件夾遞歸讀取、word文件輸出、數據存儲處理;下面分開介紹這四方面。
4.1不同編碼方式的源文件讀取
軟件的源代碼以文本形式存儲,文本的存儲主要分為ANSI、UTF-8、UTF-16這三種編碼風格,因此在軟件中讀取的過程中就首先需要判斷源文件的編碼風格,判斷方法主要是通過源文件中開頭的BOM標志,沒有BOM標志時即為ANSI編碼,無需轉換。
UTF-8 BOM標志為0xEF、0xBB、0xBF,而且UTF-8不需要BOM來表明字節順序,無需對CPU的大端、小端情況區別對待;UTF-16 BOM標志區分大端、小端情況,大端為0xFE、0xFF,小端則相反。
當檢測到為UTF-8、UTF-16編碼風格的源代碼文件時需要將讀取到的字符串轉換為ANSI風格的字符串,筆者采用的方法是通過Windows API函數:WideCharToMultiByte、MultiByteToWideChar完成UTF風格字符轉為ANSI風格字符串[3]。
4.2文件夾中子文件夾遞歸讀取
軟件需要做到對目標文件夾下的所有文件的統計、匯總,包括目標文件夾下的子文件夾中文件,所以在讀取到文件夾中的子文件夾時,就需要考慮對子文件夾中的文件讀取。
筆者采用的解決方案為:使用MFC中的CFileFind類對文件進行操作,當遍歷到目標文件夾下的文件時,進行讀取、存儲操作,若當前文件為子文件夾時,則對子文件夾時對其進行遞歸調用。另外需要注意在Dos系統下,每個目錄下都有兩個缺省的目錄,分別為“.”與“..”,它們各自代表本層目錄與上一層目錄,所以在遍歷文件夾中文件時需要將這兩者過濾掉[4-9]。
4.3 word文件輸出
Word文件的輸出最為重要,對于操作word筆者采用OLE/COM技術, OLE全稱為Object Linking and Embedding,這項技術是由微軟提出的一種面向對象的技術,通過它可以開發可重復使用的組件,本程序就是利用微軟留下的這些接口實現對word進行操作。
首先確保MFC程序創建支持自動化,然后打開Office的安裝目錄,找到MSWORD.OLD文件,導入Office中的類庫,即可自動生成與word操作所對應的類與文件,此處需要將每個頭文件中的#import "E:\\TTMv8\\Debug\\MSWORD.OLB" no_namespace部分注釋掉,之后利用vs生成的類將word的操作封裝為一個WordClass類,實現創建文檔、保存文檔、輸出文字、輸出標題、輸出頁數、創建表格、在表格中輸出指定文字功能,在使用時直接由WordClass的類對象直接調用即可。其中關鍵性代碼如下:
(1)創建服務器連接(BOOL CreateAPP())
m_app.CreateDispatch(_T("Word.Application"));
(2)創建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參數為保存文件的路徑。
(4)創建表格(void CreateTable(int Row, int Column))
CComVariant DefaultBehavior(1), AutoFitBehavior(2);
m_tabs.Add(m_sel.get_Range(), Row, Column, &DefaultBehavior, &AutoFitBehavior);
創建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)輸出標題(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));
設置title為標題,其中level:為1時輸出正文,為2輸出一級標題,為3輸出二級標題,并以此類推。
(7)輸出正文(void WriteText(CString Text))
m_sel.TypeText(Text);
(8)設置頁碼(void WritePageNum())
m_sel.get_ParagraphFormat().put_Alignment(1);? ? 設置對齊方式為居中;
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);
輸出當前頁碼;
m_sel.MoveRight(COleVariant((short)1),COleVariant((short)1), &covZero);
fields.Add(m_sel.get_Range(), COleVariant((short)26), COleVariant(_T("NUMPAGES? ")), &covTrue);
輸出總頁碼數;
oView.put_SeekView(0);
關閉頁眉頁腳。
4.4數據存儲處理
讀取文件筆者是通過MFC CFile類方法實現。
獲取文件信息用GetStatus()函數可獲取文件日期信息,GetLength()函數用來獲取文件大小信息。對于文件基本信息的存儲,用一個結構體FileInformation來存放,FileInformation結構體代碼如下:
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的指針,用以存放每個文件的基本信息;
對于源代碼統計信息,獲取完文件基本信息之后,開始正式讀取源文件的內容,通過調用WordClass的WriteText方法將源代碼的每一行保存到WordClass對象中,讀取該文件后,直接調用SaveAs輸出。
在完成匯總輸出源代碼統計之后,再調用CreateDocument創建一個新的word,隨后創建表格,將文件基本信息按照格式輸出到表格中,最后輸出即可。
5 輸出效果
圖3為源代碼的文件統計清單效果圖,圖4為源代碼的統計匯總效果圖。
6結語
本軟件雖然達到了設計目標,但是距離稱為一款完善的源代碼統計軟件還有一定距離,例如對于源代碼文件中的注釋行統計、輸出其他格式的文件等,這仍需要進一步的改進和提升。
參考文獻
[1] 鄭文嬋.應用于軟件測試的代碼統計系統的設計與實現[D].成都:《西華大學碩士論文》,2014年.
[2] 舒濤.基于COM技術的實體卡系統試卷生成技術研究[J].赤峰學院學報(自然科學版),2013,29(8):14-16.
[3] Jeffrey Richter, Christophe Nasarre著.Windows核心編程(第5版)[M].葛子昂,北京.清華大學出版社,2008.
[4] 侯俊杰. 深入淺出MFC(第2版) [M].武漢.華中科技大學出版社,2001.
[5] 孫鑫.VC++深入講解(修訂版)[M].北京.電子工業出版社,2006.
[6] Stephen Prata著.C++ Primer Plus[M].張海龍等譯,北京:人民郵電出版社,2012.
[7] 嚴蔚敏,吳偉民.數據結構(C 語言版)[M].北京.清華大學出版社,2011.
[8] 程杰.大話數據結構[M].北京.清華大學出版社,2011.
[9] 程杰.大話設計模型[M].北京.清華大學出版社,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