麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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性高湖久久久久久久久网站 | 国产一区二区三区四 | 色播视频网站 | 中国老女人一级毛片视频 | 成年人观看免费视频 | 欧美一级在线看 | 成年人黄色免费网站 | 亚洲欧美一区二区三区在线观看 | 国产精品一区在线免费观看 | 鲁久久| 久色精品视频 | 毛片免费看电影 | 无码av女优 | 麻豆国产网站 | 久久综合久久美利坚合众国 | www.99热精品 | 国产成人精品一区二区仙踪林 | xxxx69hd一hd| 久久久久久久久国产 | 老师你怎么会在这第2季出现 | 日本看片一区二区三区高清 | a免费看| 国产一级在线免费观看 | 国产精选电影免费在线观看网站 | 91av资源在线| 美女污污视频在线观看 | 爱操在线 | 国产91九色视频 | 国产精品91久久久 | 精品国产乱码久久久久久丨区2区 | 国产亚洲精品成人a | 国产99久久精品一区二区300 | 日韩视频―中文字幕 | 日韩剧情片 | 久草在线新视觉 | 特黄一级小说 | 欧美三级毛片 | 蜜桃视频在线观看免费 | av播放在线 |