公司里每个程序员在命名空间的排序和注释上都有很多的不同。
杂乱的命名空间:
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<int> Resultlist = null; public List<int> Existinglist = null; ... ....
有序的命名空间:
// // (C) Copyright 2010-2016 by XXX, Inc. // // System namespaces using System; using System.Collections.Generic; using System.Linq; using System.Text; // Autodesk namespaces using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; // BIMCore namespaces using BIMCore.DB; using BIMCore.DB.Geometry; // My namespaces using 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 List<string> liststrdocuments = new List<string>(); 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<string> listtempline = new List<string>(); 64 List<string> listnamespacerest = new List<string>(); 65 List<string> namespacesurplus = new List<string>(); 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 + " "; 117 } 118 #endregion 119 120 121 listtempline.Sort(delegate(string str1, string str2) //对命名空间进行排序 122 { 123 return Comparer<string>.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 + " "; 132 } 133 else if (line.StartsWith("using Autodesk")) 134 { 135 strusingAutodesk += line + " "; 136 } 137 else if (line.StartsWith("using BIMCore")) 138 { 139 strusingBIMCore += line + " "; 140 } 141 else 142 { 143 strusingrest += line + " "; 144 } 145 } 146 string strusingAutodeskresult; 147 string strusingBIMCoreresult; 148 string strusingrestresult; 149 strusingAutodeskresult = strusingBIMCoreresult = strusingrestresult = string.Empty; 150 string strusingsystemresult = "// System namespaces" + " " + strusingsystem + " "; 151 152 if (!string.IsNullOrWhiteSpace(strusingAutodesk)) 153 { 154 strusingAutodeskresult = strusingAutodesk; 155 strusingAutodeskresult = "// Autodesk namespaces" + " " + strusingAutodesk + " "; 156 } 157 if (!string.IsNullOrWhiteSpace(strusingBIMCore)) 158 { 159 strusingBIMCoreresult = strusingBIMCore; 160 strusingBIMCoreresult = "// BIMCore namespaces" + " " + strusingBIMCore + " "; 161 } 162 if (!string.IsNullOrWhiteSpace(strusingrest)) 163 { 164 strusingrestresult = strusingrest; 165 strusingrestresult = "// My namespaces" + " " + strusingrestresult + " "; 166 } 167 namespaceresult = textboxcopyright + " " + 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 #endregion 193 } 194 } 195 else 196 { 197 progressBarFiles.Visible = false; 198 MessageBox.Show(Properties.Resources.StringTextBoxCopyrightStauts); 199 } 200 } 201 else 202 { 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.html
public 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+" "; 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 + " "; 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; }