使用Python语言 ,实现批量删除C/C++类型注释
1.目前支持去掉.h .hpp .c .cpp .java 这些以//或/**/为注释符的源文件
2.支持递归遍历目录
3.当前版本为Python2.7版本,故只有安装了Python2.7(或Python3.x以下版本的才可以直接使用,测试没问题后将编出exe直接使用)
4.使用方法:
(1)建立源目录,如d:\src(路径中最好不要有中文);
(2)建立目标目录,如d:\dst(路径中最好不要有中文);
(3)将RemoveComment.py放到某处(路径中最好不要有中文),如d:\RemoveComment.py
(4)打开cmd,输入切换到(3)中RemoveComment.py所在的目录(这里是d:\),输入python RemoveComment.py d:\src d:\dst,回车
(5)去掉了注释的源代码将放在d:\dst目录中
http://download.youkuaiyun.com/download/zp373860147/4361780
#coding:utf-8
importosimportsysdefDelComment(src, dst):
fSrc= open(src, 'rb')
fDst= open(dst, 'wb')
out=[]
STATE_NORMAL=0
STATE_BEGIN= 1STATE_LINE_COMMENT= 2STATE_BLOCK_COMMENT= 3STATE_END= 4State=STATE_NORMALwhile 1:
ReadInChar= fSrc.read(1)if ReadInChar == '':break;if State ==STATE_NORMAL:if ReadInChar == '/':
State=STATE_BEGINelse:
out.append(ReadInChar)elif State ==STATE_BEGIN:if ReadInChar == '/':
State=STATE_LINE_COMMENTelif ReadInChar == '*':
State=STATE_BLOCK_COMMENTelse:
State=STATE_NORMAL
out.append('/'+ReadInChar)elif State ==STATE_LINE_COMMENT:if ReadInChar == '\n':
State=STATE_NORMALelif State ==STATE_BLOCK_COMMENT:if ReadInChar == '*':
State=STATE_ENDelif State ==STATE_END:if ReadInChar == '/':
State=STATE_NORMAL
ReadInChar= fSrc.read(1)while ReadInChar == '\r' or ReadInChar == '\n':
ReadInChar= fSrc.read(1)
fSrc.seek(-1, 1)else:
State=STATE_BLOCK_COMMENT
fSrc.seek(-1, 1)
fDst.writelines(out)
fDst.flush()
fDst.close()
fSrc.close()defscanDir(srcpath, dstpath):ifos.path.isdir(srcpath):for files inos.listdir(srcpath):
fSrc=os.path.join(srcpath, files)ifos.path.isfile(fSrc):
scanDir(fSrc, dstpath)else:
fDst=os.path.join(dstpath, files)if notos.path.exists(fDst):
os.mkdir(fDst)
scanDir(fSrc, fDst)else:if srcpath.endswith(('.h','.c','.cpp','.hpp','.jave'):
DelComment(srcpath, os.path.join(dstpath, os.path.basename(srcpath)))if __name__ == '__main__':
paramlen=len(sys.argv)if paramlen!=3:print '输入参数错误'sys.exit(1)
srcpath= sys.argv[1].rstrip('\\').rstrip('/')print 'src_path:' +srcpath
dstpath= sys.argv[2].rstrip('\\').rstrip('/')print 'dst_path:' +dstpathprint 'convert......'scanDir(srcpath, dstpath)print 'done!'