刘洁 李青元 石元会
摘要:源代码汇总在软件项目的项目管理、测试、验收等环节都可发挥重要的作用。本文提出开发一个软件源代码汇总工具的必要性,给出了软件的设计思路、模块划分、用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