呼,從12月開始,開始學習,使用C#了.還好自己之前是學過C和C++,學起來不那麼困難.特性很多,沒有貪多地去掌握.
在項目裡,暫時沒有我什麼事,自己在那,學習引擎,看服務端和用戶端的代碼.每天就是自己給自己找事情做,不然就會枯燥.有的時候啊,會比較悶的,忍咯,比從前的日子還是好過度多了.
這種程式,很久以前寫過一個.是用C寫的.這個呢,是C#,比C的功能多了許多.這個語言還是不錯,純物件導向.
不多說了,好久沒有寫博了,今天終於有機會,寫一個了.今天是那個西方的節日,沒我什麼事,呵呵.不多說了,帖.
// Program.cs -- 2011-12-14-16.35using System;using System.IO;namespace CountLines{ // 統計單個檔案資訊 public class CountFileInfo { private bool m_ignoreCommentary; // 是否忽略注釋 private StreamReader m_reader; // 檔案讀流 private int m_charNum = 0; // 字元數 private int m_lineNum = 0; // 行數 private string m_fileName; // 檔案名稱 // 私人方法 private void m_countALine(string aLine) { // 如果忽略注釋並且在aLine中出現了"//" if (m_ignoreCommentary && aLine.Contains(@"//")) { for (int i = 0; i != aLine.Length; ++i) { if (aLine[i] == '/' && i < aLine.Length - 1 && aLine[i + 1] == '/') return; else ++m_charNum; } } else { foreach (char c in aLine) { // 跳過空格 if (c != ' ') { ++m_charNum; } } } } // 公有方法 public CountFileInfo(bool ignoreCommentary = true) { m_ignoreCommentary = ignoreCommentary; } public void Initialize(StreamReader reader, string fileName) { m_reader = reader; m_charNum = 0; m_lineNum = 0; m_fileName = fileName; } public void Count() { string buff = m_reader.ReadLine(); while (buff != null) { // 忽略空行 if (buff.Length != 0) { ++m_lineNum; m_countALine(buff); } buff = m_reader.ReadLine(); } } public int CharNum { get { return m_charNum ; } } public int LineNum { get { return m_lineNum ; } } public string FileName { get { return m_fileName ; } } } // 統計所有檔案以及目錄資訊 public class CountGlobalInfo { private uint m_fileNum; // 檔案總數 private uint m_charNum; // 總字元數 private uint m_lineNum; // 總行數 public CountGlobalInfo() { m_fileNum = 0; m_charNum = 0; m_lineNum = 0; } public void AddAFile(CountFileInfo countFileInfo) { ++m_fileNum; m_charNum += (uint) countFileInfo.CharNum; m_lineNum += (uint) countFileInfo.LineNum; } public uint FileNum { get { return m_fileNum; } } public uint CharNum { get { return m_charNum; } } public uint LineNum { get { return m_lineNum; } } } public class WriteResult { private string m_indentBuff ; private StreamWriter m_writer; public WriteResult(string targetDirectory) { m_writer = new StreamWriter("統計結果.txt", false) ; } private void m_processIndent(int indentLevel) { m_indentBuff = null ; for (int i = 0; i != indentLevel; ++i) { m_indentBuff += " " ; } } public void go(CountFileInfo countFileInfo, int indentLevel) { m_processIndent(indentLevel); m_writer.WriteLine(m_indentBuff + "檔案: " + countFileInfo.FileName) ; m_writer.WriteLine(m_indentBuff + "行: " + countFileInfo.LineNum.ToString()) ; m_writer.WriteLine(m_indentBuff + "字元:" + countFileInfo.CharNum.ToString()); m_writer.WriteLine(""); } public void go(CountGlobalInfo countGolbalInfo) { m_writer.WriteLine("檔案總數: " + countGolbalInfo.FileNum.ToString()) ; m_writer.WriteLine("全部行數: " + countGolbalInfo.LineNum.ToString()) ; m_writer.WriteLine("全部字元數:" + countGolbalInfo.CharNum.ToString()); } public void Save() { m_writer.Close(); } } // 遍曆以根目錄為根的分類樹 public class Travel { private DirectoryInfo m_rootDirectory; // 根目錄 private string m_Extension; // 檔案名稱尾碼,即檔案類型 CountFileInfo m_countFileInfo; // 統計檔案類的執行個體 CountGlobalInfo m_countGlobalInfo; // 統計全域資訊類的執行個體 WriteResult m_writeResult; // 寫統計結構類的執行個體 int m_indentLevel = 0; // 縮排數 // 公有方法 public Travel(string rootDirectory, string extension = ".cs", bool ignoreCommentary = true) { m_rootDirectory = new DirectoryInfo(rootDirectory); if (m_rootDirectory == null) { throw new System.Exception("無效的目前的目錄名!"); } m_countFileInfo = new CountFileInfo(ignoreCommentary); m_countGlobalInfo = new CountGlobalInfo(); m_writeResult = new WriteResult(rootDirectory); m_Extension = extension; } public void go(DirectoryInfo currentDirectory) { // 統計目前的目錄下的所有檔案 foreach (FileInfo file in currentDirectory.GetFiles()) { if (file.Extension == m_Extension) { // 統計指定的檔案類型 StreamReader reader = file.OpenText(); m_countFileInfo.Initialize(reader, file.Name); m_countFileInfo.Count(); m_countGlobalInfo.AddAFile(m_countFileInfo); m_writeResult.go(m_countFileInfo, m_indentLevel); reader.Close(); } } ++m_indentLevel; // 擷取目前的目錄下的所有子目錄 DirectoryInfo[] subDirectories = currentDirectory.GetDirectories(); foreach (DirectoryInfo directory in subDirectories) { go(directory); } --m_indentLevel; if (m_indentLevel == 0) { // 列印最終全域統計結果. m_writeResult.go(m_countGlobalInfo); m_writeResult.Save(); } } public DirectoryInfo RootDirectoryInfo { get { return m_rootDirectory; } } } public class program { public static void Main() { Console.WriteLine( "此程式可以統計出所在檔案夾及其子檔案夾中所有檔案的行數和字元數資訊\n" + "忽略所有注釋,並將在本程式所在檔案夾產生一個存放統計結果的檔案\n" + "\"統計結果.txt\".單擊斷行符號鍵開始統計."); Console.ReadKey(); Console.WriteLine("\n開始統計,請耐心等候..."); Travel travel = new Travel(Directory.GetCurrentDirectory()); travel.go(travel.RootDirectoryInfo); Console.WriteLine("統計完畢,已將統計結果寫入\"統計結果.txt\"檔案中."); Console.WriteLine("單擊斷行符號退出程式."); Console.ReadKey(); } }}