亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

c# 簡易繪制C語言頭文件包含關系圖

2019-11-17 02:50:21
字體:
來源:轉載
供稿:網友

c# 簡易繪制C語言頭文件包含關系圖

最近在做一個項目的移植工作,項目很大,光c文件大約有1800多。由于某些需要,想要對某些代碼文件引用的.h文件進行分析。

網上找了好久,暫無發現類似的工具。

正好,今天放假,就做了這么個工具。

好了,廢話不多說了,先上圖。

QQ截圖20141012191057

由于是自己做的個demo,所以只是先注重大體功能上的實現,細節上還有很多不足。比如沒有使用多線程,去除代碼文件中注釋的地方還有個漏洞(文件讀取1M導致的,不過幾乎沒影響),還有循環繪制node的地方(邏輯上稍微修改下更好)。

后面奉上代碼,大家可以自己根據需求繼續修改,也可以湊合這么用。

言歸正傳。

樹形關系呈現上使用了DotNetBar中的TreeGX控件。下載地址:

http://down2.cr173.com/soft1/DotNetBarSetup.zip

先setup,再patcher。

裝好后,先添加引用,然后在工具箱中添加treeGX。

QQ截圖20141012200812

沒錯,項目名Jonce,“窮死”。好名字。

界面布局。

QQ截圖20141012202708

其實整個流程很簡單,1獲取指定目錄下的所有代碼文件;2分析出文件中#include包含的文件;3繪制node節點

CType.cs文件內容:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Jonce{    struct CType    {        public string FullPath;        public string FileName;        public List<string> IncludeList;    }}

該類型用于描述每個代碼文件。

CFileHelper.cs文件內容:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace Jonce{    class CFileHelper    {        PRivate List<string> fileList = new List<string>();        /// <summary>        /// 獲取及分析所有C代碼文件        /// </summary>        /// <param name="path">C項目路徑</param>        /// <returns></returns>        public List<CType> GetAllCFile(string path)        {            List<CType> retList = new List<CType>();            getAllByPath(path);            //過濾出所有文件中的代碼文件            //分析引用,并存入List<CType>結構內            foreach (string item in fileList)            {                string extension = Path.GetExtension(item).ToLower();                if (extension == ".c" || extension == ".h" || extension == ".cpp")                {                    CType cType = new CType();                    cType.FullPath = item;                    cType.FileName = Path.GetFileName(item);                    //獲取C文件中include引用的頭文件                    cType.IncludeList = SourceHelper.GetIncludeFile(SourceHelper.RemoveComments(item));                    retList.Add(cType);                }            }            return retList;        }        //獲取指定目錄下的所有文件        private void getAllByPath(string path)        {            if (path.EndsWith("//"))            {                fileList.Add(path);            }            else            {                fileList.Add(path + "//");            }            string[] dirs = Directory.GetDirectories(path);            fileList.AddRange(Directory.GetFiles(path));            foreach (string dir in dirs)            {                getAllByPath(dir.ToString());            }        }    }}

SourceHelper.cs文件內容:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Windows.Forms;using System.Text.RegularExpressions;namespace Jonce{    class SourceHelper    {        /// <summary>        /// 去掉代碼文件中的注釋        /// </summary>        /// <param name="filePath">文件全路徑</param>        /// <returns>文件前1M內容(去掉注釋)</returns>        public static string RemoveComments(string filePath)        {            string retStr = "";            //1M緩沖區            char[] buffer = new char[1024 * 1024];            using (FileStream fs = new FileStream(filePath, FileMode.Open, Fileaccess.Read))            {                using (StreamReader sr = new StreamReader(fs, Encoding.Default))                {                    try                    {                        //string fileStr = sr.ReadToEnd();                        //讀取文件。只讀取<=1M內容                        sr.Read(buffer, 0, buffer.Length);                        //字符數組轉換為字符串,進行正則匹配                        string fileStr = new string(buffer);                        //正則表達式,匹配多行注釋和單行注釋                        string regStr = @"//*[/s/S]*?/*/|//.*";                        //去掉多行注釋                        retStr = Regex.Replace(fileStr, regStr, "");                    }                    catch (Exception ex)                    {                        MessageBox.Show(ex.ToString(), "ERR");                    }                }            }            return retStr;        }        /// <summary>        /// 獲取C文件中include引用的頭文件        /// </summary>        /// <param name="fileStr">文件全路徑</param>        /// <returns>頭文件List集合</returns>        public static List<string> GetIncludeFile(string fileStr)        {            List<string> headFileList = new List<string>();            //匹配include語句            string regStr1 = @"#/s*include/s(""|<).*";            //匹配頭文件            string regStr2 = @"/w+/.(h|H)/b";            Match mc1 = Regex.Match(fileStr, regStr1);            while (mc1.Success)            {                Match mc2 = Regex.Match(mc1.ToString(), regStr2);                if (mc2.Success)                {                    headFileList.Add(mc2.ToString());                }                mc1 = mc1.NextMatch();            }            return headFileList;        }    }}

Form1.cs內容:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using DevComponents.Tree;namespace Jonce{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            //選取目錄            FolderBrowserDialog fbd = new FolderBrowserDialog();            if (fbd.ShowDialog()==DialogResult.OK)            {                string path = fbd.SelectedPath;                CFileHelper fileHelper = new CFileHelper();                //獲取及分析所有C代碼文件                List<CType> cTypeList = fileHelper.GetAllCFile(path);                //treeGX.Node節點用style                ElementStyle style = new ElementStyle();                //節點文字顏色設置                style.TextColor = Color.Blue;                foreach (CType item in cTypeList)                {                    if (Path.GetExtension(item.FullPath).ToLower() == ".c")                    {                        Node cNode = new Node();                        cNode.Name = item.FileName;                        cNode.Text = item.FileName;                        cNode.Style = style;                        cNode.NodeDoubleClick += cNode_NodeDoubleClick;                        this.node1.Nodes.Add(cNode);                        loopDraw(cTypeList, item.FileName, ref cNode);                    }                }                //this.node1.ExpandAll();                this.node1.Text = path;                //刷新treeGX                this.treeGX1.Refresh();            }                    }        void cNode_NodeDoubleClick(object sender, EventArgs e)        {            Node node = sender as Node;            node.Expand();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品黄色网| 色偷偷88888欧美精品久久久| 日韩成人在线视频| 亚洲精品v欧美精品v日韩精品| 欧美日韩国产页| 亚洲精美色品网站| 日韩国产欧美精品在线| 日韩视频精品在线| 国产99久久久欧美黑人| 成人精品在线视频| 自拍偷拍免费精品| 久久99精品久久久久久青青91| 九九精品视频在线观看| 色悠悠国产精品| 欧洲成人免费aa| 91精品国产乱码久久久久久久久| 日本aⅴ大伊香蕉精品视频| 久久露脸国产精品| 一区二区三区视频观看| 亚洲第一网站免费视频| 热99在线视频| 亚洲成人a级网| 欧美国产日韩在线| 欧美日韩国产在线看| 欧美日韩一区二区免费在线观看| 久久九九有精品国产23| 国产精品青青在线观看爽香蕉| 一区二区欧美激情| 日本91av在线播放| 亚洲欧美日韩精品久久奇米色影视| 丝袜美腿精品国产二区| 色婷婷**av毛片一区| 亚洲欧洲午夜一线一品| 日韩av毛片网| 中文字幕无线精品亚洲乱码一区| 96国产粉嫩美女| 日韩国产高清污视频在线观看| 久久久久久12| 福利二区91精品bt7086| 日本一区二区三区在线播放| 国产日韩欧美电影在线观看| 欧美巨大黑人极品精男| 欧美激情视频网址| 日韩在线小视频| 亚洲国产精品va在线| 欧美高清视频免费观看| 国产精品视频自在线| 伊人久久久久久久久久久| 亚洲美女黄色片| 欧美成人午夜剧场免费观看| 日本免费一区二区三区视频观看| 超薄丝袜一区二区| 另类少妇人与禽zozz0性伦| 午夜精品久久久久久99热软件| 国产精品一区二区三区成人| 另类专区欧美制服同性| 亚洲美女视频网站| 精品国内产的精品视频在线观看| 97精品欧美一区二区三区| 中文字幕国产精品久久| 亚洲2020天天堂在线观看| 亚洲毛片在线看| 精品夜色国产国偷在线| 亚洲国产精品va在看黑人| 国内精品久久久久伊人av| 日韩精品在线免费观看视频| 欧美激情精品久久久久久变态| 国产精品久久久久久久久久久久久久| 欧美成人免费一级人片100| 国产日产久久高清欧美一区| 久久精品一本久久99精品| 国产69精品久久久久9999| 国产精品旅馆在线| 国精产品一区一区三区有限在线| 97视频在线播放| 色综合天天狠天天透天天伊人| 国产精品视频自在线| 亚洲一区第一页| 久久全球大尺度高清视频| 97超视频免费观看| 日韩电影中文字幕在线观看| 亚洲免费中文字幕| 亚洲精品丝袜日韩| 国产在线a不卡| 欧亚精品在线观看| 亚洲风情亚aⅴ在线发布| 国产欧美精品日韩精品| 久久九九免费视频| 久久精品中文字幕电影| 中文字幕av一区二区三区谷原希美| 有码中文亚洲精品| 国产一区二区三区四区福利| 日韩中文字幕视频在线观看| 北条麻妃一区二区在线观看| 亚洲区一区二区| 91系列在线播放| 亚洲人成啪啪网站| 国产91在线高潮白浆在线观看| 91理论片午午论夜理片久久| 成人午夜激情免费视频| 日韩av中文字幕在线免费观看| 狠狠躁天天躁日日躁欧美| 精品日韩中文字幕| 九九九久久国产免费| 色综合色综合久久综合频道88| 久久精品青青大伊人av| 国产精品视频自在线| 国产精品99久久久久久久久久久久| 欧美一区二三区| 亚洲精品视频在线观看视频| 亚洲激情国产精品| 97色在线观看免费视频| 日韩中文字幕亚洲| 日韩中文字幕精品| 日韩在线免费高清视频| 久久99国产综合精品女同| 97在线日本国产| 国产精品r级在线| 91中文在线视频| 欧美日韩国产麻豆| 91亚洲国产成人精品性色| 国产午夜精品视频免费不卡69堂| 欧美精品免费在线观看| 久久大大胆人体| 国产精品一二三视频| 日韩欧美亚洲综合| 色婷婷久久一区二区| 亚洲日韩中文字幕在线播放| 国产精品久久av| 国产在线观看精品| 欧美性色xo影院| 国产精品视频成人| 欧美xxxx14xxxxx性爽| 欧美亚洲成人xxx| 欧美日韩国产一中文字不卡| 精品久久久久久久久国产字幕| 日本精品va在线观看| 亚洲精品第一页| 欧美日韩综合视频网址| 亚洲精品一区中文字幕乱码| 青青草原一区二区| 久久久久久有精品国产| 欧美夫妻性生活视频| 欧美丝袜美女中出在线| 欧美电影在线观看完整版| 亚洲精品在线91| 日韩最新中文字幕电影免费看| 日韩免费av在线| 色偷偷91综合久久噜噜| 欧美成人精品在线观看| 日韩小视频网址| 日韩视频亚洲视频| 欧美日韩精品在线观看| 日本一本a高清免费不卡| 国产精品三级网站| 亚洲美女免费精品视频在线观看| 中文字幕不卡在线视频极品| 日韩精品视频在线观看网址| 亚洲视频在线免费观看| 91国内精品久久| 欧美xxxx做受欧美.88| 久久这里只有精品视频首页| 精品国产区一区二区三区在线观看| 日韩成人激情在线|