公司里每个程序员在命名空间的排序和注释上都有很多的不同。
杂乱的命名空间:
using System;using System.Collections.Generic;using Autodesk.Revit.UI;using BIMCore.UI.ModelessForm;using System.Text;using System.Windows.Forms;using System.Threading;using RevitDocument = Autodesk.Revit.DB.Document;using Autodesk.Revit.DB;using BIMCore.UI;using BIMCore.DB;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using BIMCore.DB.Geometry;using Res = Revit.Addin.isBIM.QuickFilters.Properties.Resources;using BIMCore.DB.Log;namespace Revit.Addin.isBIM.QuickFilters{ public partial class CustomForm : System.Windows.Forms.Form { RevitDocument rvtDoc_temp = null; public List Resultlist = null; public List Existinglist = null; ... ....
有序的命名空间:
//// (C) Copyright 2010-2016 by XXX, Inc.//// System namespacesusing System;using System.Collections.Generic;using System.Linq;using System.Text;// Autodesk namespacesusing Autodesk.Revit.DB;using Autodesk.Revit.UI;using Autodesk.Revit.UI.Selection;// BIMCore namespacesusing BIMCore.DB;using BIMCore.DB.Geometry;// My namespacesusing Res = Revit.Addin.isBIM.PowerMeasure.Properties.Resources;using Revit.Addin.isBIM.PowerMeasure.Views;using Revit.Addin.isBIMAppWrapper;namespace Revit.Addin.isBIM.PowerMeasure{... ...
为了方便管理代码,这里我制作了一个批量处理.cs文件中命名空间排序及注释的工具。
代码:
1 private void buttonConfirm_Click(object sender, EventArgs e) 2 { 3 string strfilepath = textBoxFilePath.Text; 4 Listliststrdocuments = new List (); 5 progressBarFiles.Visible = true; 6 if (!string.IsNullOrWhiteSpace(textBoxFilePath.Text) && System.IO.Directory.Exists(textBoxFilePath.Text)) //判断路径是否为空或者是否存在 7 { 8 if (!string.IsNullOrWhiteSpace(textBoxNameSpace.Text)) 9 { 10 string[] strdocuments = Directory.GetFiles(strfilepath, "*.cs",SearchOption.AllDirectories); //得到文件夹路径下的所有cs文件路径 11 if (strdocuments.Length == 0) //判断文件夹中是否没有cs文件 12 { 13 progressBarFiles.Visible = false; 14 MessageBox.Show(Properties.Resources.StringFileExist); 15 } 16 else 17 { 18 foreach (string strdocu in strdocuments) //排除部分cs文件,其中obj文件夹下的cs文件直接忽略 19 { 20 if(boolMode==true) 21 { 22 if (!strdocu.Contains("AssemblyInfo") && !strdocu.Contains("Designer") && !strdocu.Contains("obj") && !strdocu.Contains("designer")) 23 { 24 liststrdocuments.Add(strdocu); 25 } 26 } 27 else 28 { 29 if(!strdocu.Contains("obj")) 30 { 31 liststrdocuments.Add(strdocu); 32 } 33 } 34 } 35 36 for (int i = 0; i < liststrdocuments.Count; i++) //改变文件只读属性 37 { 38 if (File.GetAttributes(liststrdocuments[i]).ToString().IndexOf("ReadOnly") != -1) 39 { 40 File.SetAttributes(liststrdocuments[i], FileAttributes.Normal); 41 } 42 } 43 int intprogress = 0; 44 progressBarFiles.Maximum = liststrdocuments.Count; 45 DataTable dt = new DataTable(); 46 dt.Columns.Add((Properties.Resources.StringDatagridViewCellHeaderOne), typeof(string)); 47 dt.Columns.Add((Properties.Resources.StringDatagridViewCellHeaderTwo), typeof(string)); 48 string strupdatestatus = null; 49 50 foreach (string Documentpath in liststrdocuments) //遍历每个路径 51 { 52 System.Text.Encoding fileEncoding = GetFileEncodeType(Documentpath); //获取该文件的编码格式 53 intprogress++; 54 progressBarFiles.Value = intprogress; 55 string namespacerest = null; 56 string strusingsystem = null; 57 string strusingAutodesk = null; 58 string strusingBIMCore = null; 59 string strusingrest = null; 60 string namespaceresult = string.Empty; 61 string textboxcopyright = textBoxNameSpace.Text; 62 63 List listtempline = new List (); 64 List listnamespacerest = new List (); 65 List namespacesurplus = new List (); 66 67 68 if (DocumentChanged(Documentpath) == false) 69 { 70 strupdatestatus = Properties.Resources.StringUpdateStatusOne; 71 dt=BuildDataTable(dt,Documentpath,strupdatestatus); 72 } 73 else 74 { 75 string[] lines = File.ReadAllLines(Documentpath); //根据路径,分行读取该文件 76 foreach (string line in lines) 77 { 78 if (line.StartsWith("using")) 79 { 80 listtempline.Add(line); //得到命名空间的行 81 } 82 else if (!string.IsNullOrWhiteSpace(line)) 83 { 84 listnamespacerest.Add(line); //记录剩下的部分 85 } 86 strupdatestatus = Properties.Resources.StringUpdateStatusTwo; 87 } 88 89 #region 对namespace中的多余部分进行处理,保留没有空行的部分 90 foreach (string line in listnamespacerest) 91 { 92 if (line.StartsWith("namespace") || line.StartsWith("[")) 93 { 94 break; 95 } 96 else if (!string.IsNullOrWhiteSpace(line)) 97 { 98 namespacesurplus.Add(line); 99 }100 }101 if (namespacesurplus.Count != 0)102 {103 for (int i = 0; i < listnamespacerest.Count; i++)104 {105 for (int j = 0; j < namespacesurplus.Count; j++)106 {107 if (namespacesurplus[j] == listnamespacerest[i])108 {109 listnamespacerest.RemoveAt(i);110 }111 }112 }113 }114 foreach (string line in listnamespacerest)115 {116 namespacerest += line + "\r\n";117 }118 #endregion119 120 121 listtempline.Sort(delegate(string str1, string str2) //对命名空间进行排序122 {123 return Comparer .Default.Compare(str1.Trim(';'), str2.Trim(';'));124 });125 126 127 foreach (string line in listtempline) //对命名空间行归类128 {129 if (line.StartsWith("using System"))130 {131 strusingsystem += line + "\r\n";132 }133 else if (line.StartsWith("using Autodesk"))134 {135 strusingAutodesk += line + "\r\n";136 }137 else if (line.StartsWith("using BIMCore"))138 {139 strusingBIMCore += line + "\r\n";140 }141 else142 {143 strusingrest += line + "\r\n";144 }145 }146 string strusingAutodeskresult;147 string strusingBIMCoreresult;148 string strusingrestresult;149 strusingAutodeskresult = strusingBIMCoreresult = strusingrestresult = string.Empty;150 string strusingsystemresult = "// System namespaces" + "\r\n" + strusingsystem + "\r\n";151 152 if (!string.IsNullOrWhiteSpace(strusingAutodesk))153 {154 strusingAutodeskresult = strusingAutodesk;155 strusingAutodeskresult = "// Autodesk namespaces" + "\r\n" + strusingAutodesk + "\r\n";156 }157 if (!string.IsNullOrWhiteSpace(strusingBIMCore))158 {159 strusingBIMCoreresult = strusingBIMCore;160 strusingBIMCoreresult = "// BIMCore namespaces" + "\r\n" + strusingBIMCore + "\r\n";161 }162 if (!string.IsNullOrWhiteSpace(strusingrest))163 {164 strusingrestresult = strusingrest;165 strusingrestresult = "// My namespaces" + "\r\n" + strusingrestresult + "\r\n";166 }167 namespaceresult = textboxcopyright + "\r\n" + strusingsystemresult + //重写文件168 strusingAutodeskresult + strusingBIMCoreresult + strusingrestresult + namespacerest;169 File.WriteAllText(Documentpath, namespaceresult, fileEncoding);170 171 textboxcopyright = strusingsystem = strusingAutodesk = strusingBIMCore = strusingrest = namespacerest = string.Empty; //变量清空172 dt=BuildDataTable(dt, Documentpath, strupdatestatus); 173 174 }175 176 }177 178 #region 控件属性的设置179 dataGridViewfiles.DataSource = dt; //datagridview的设置180 dataGridViewfiles.AllowUserToAddRows = false; 181 dataGridViewfiles.RowHeadersVisible = false;182 dataGridViewfiles.AllowUserToResizeColumns = false;183 dataGridViewfiles.AllowUserToResizeRows = false;184 dataGridViewfiles.Columns[1].Width = Convert.ToInt32(Math.Ceiling(0.3 * Convert.ToDouble(dataGridViewfiles.Width))); //设定更新状态栏的列宽185 dataGridViewfiles.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //设定更新状态栏的字体居中 187 progressBarFiles.Visible = false;192 #endregion193 }194 }195 else196 {197 progressBarFiles.Visible = false; 198 MessageBox.Show(Properties.Resources.StringTextBoxCopyrightStauts);199 } 200 }201 else202 {203 progressBarFiles.Visible = false; 204 MessageBox.Show(Properties.Resources.StringTextBoxFileStatus);205 } 206 }
169行对文件重写时依然使用文件原有编码格式,防止打开文件时候有乱码。
52行的子函数 GetFileEncodeType(string filename)判断编码格式 函数转载地址:http://www.cnblogs.com/swtseaman/archive/2011/05/17/2048689.htmlpublic System.Text.Encoding GetFileEncodeType(string filename) { System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite); //FileShare.ReadWrite, 不然文件在进行其他IO操作时进程会被占用而报错 System.IO.BinaryReader br = new System.IO.BinaryReader(fs); Byte[] buffer = br.ReadBytes(2); if(buffer[0]>=0xEF) { if(buffer[0]==0xEF && buffer[1]==0xBB) { return System.Text.Encoding.UTF8; } else if(buffer[0]==0xFE && buffer[1]==0xFF) { return System.Text.Encoding.BigEndianUnicode; } else if(buffer[0]==0xFF && buffer[1]==0xFE) { return System.Text.Encoding.Unicode; } else { return System.Text.Encoding.Default; } } else { return System.Text.Encoding.Default; } } #endregion
68行为文件更新判据:判断cs文件中是否有“// System namespaces”, 还有就是cs文件中的copyright部分是否与winform中的copyright文本框内容相同。
1 private bool DocumentChanged(string path) 2 { 3 bool boolWholeStatus = true; 4 bool boolStatus1 = false; 5 bool boolStatus2 = false; 6 string oralcopyright = string.Empty; 7 string txtnamspace = textBoxNameSpace.Text+"\r\n"; 8 string[] lines = File.ReadAllLines(path); //根据路径,分行读取该文件 9 10 foreach (string line in lines)11 {12 if (line.StartsWith("// System namespaces") || line.StartsWith("// System Namespaces") || line.StartsWith("//System namespaces") || line.StartsWith("//System Namespaces"))13 {14 boolStatus2 = true;15 break;16 }17 else if(!string.IsNullOrEmpty("line"))18 {19 oralcopyright += line + "\r\n";20 }21 }22 if (txtnamspace.Equals(oralcopyright))23 {24 boolStatus1 = true;25 }26 27 if (boolStatus1 == true && boolStatus2 == true)28 {29 boolWholeStatus = false;30 }31 return boolWholeStatus;32 }
71行的datatable构建方法:
private DataTable BuildDataTable(DataTable dt, string path, string status) { DataRow dr = dt.NewRow(); dr[Properties.Resources.StringDatagridViewCellHeaderOne] = path; dr[Properties.Resources.StringDatagridViewCellHeaderTwo] = status; dt.Rows.Add(dr); return dt; }