1. 程式人生 > >wc.exe程序

wc.exe程序

管理 上一個 集中 最大的 mman int 創建 div 生成

摘要

本項目我只實現了基本功能,也就是文件的字符總數,單詞總數,以及行數的計算,以及輸出至哪個文件

並且直接使用C#語言進行編寫

整個項目我集中在一個主類和一個主方法

解題思路:

最開始采用的其實是控制臺直接輸入參數的方法,並且寫入了較為友好的文字提示信息,但是最後發現和要求不太一樣,所以又改變為doc界面帶參啟動的運行方式,利用args[]娶到帶參數啟動的參數,並且·根據args進行命令行以及文件名判斷

並且對於所有的功能是西安了單一原則的思想,然後再多追加了幾個方法對主要功能,以及字符串文件進行安全檢查,防止程序崩潰,再加上一個txt配置文件管理制定輸出文件夾

具體執行:

十個方法,分別完成相應的任務,較為符合單一原則分別為

1.CheckFileName(string fileName)      檢查文件名是否正確

2.CheckCommand(string command)     檢查命令符是否正確

3.charCount(string fileName)        字符總數

4.wordCount(string fileName)        單詞總數

5.lineCount(string fileName)         行總數

6.saveData(string fileName)        儲存信息

7.operation(string command, string fileName)  根據命令符指定操作

8.getSaveFileName()           得到儲存文件名

9.setSaveFileName(string fileName)     個性化設置儲存文件名

10.test()                 測試

技術分享圖片技術分享圖片

然後計算字符數以及單詞,行數,直接引用了System.IO,然後創建了文件流,對文件進行操作,把文件讀入至byte數組,然後再通過解碼器讀至char數組,再對每一個元素進行甄別

bool fileIsTrue;                                                        //文件名是否正確
            bool
commandIsTrue; //命令是否正確 int errorCommandNum = 0; //錯誤命令數目 //字段初始化 Program p = new Program(); fileIsTrue = p.CheckFileName(args[maxLength - 1]); if (fileIsTrue == false && args[0] != "-o") return; for (int i = 0; i < maxLength - 1; i++) //檢查命令集中是否有非法字符 { commandIsTrue = p.CheckCommand(args[i]); if (commandIsTrue == false) { errorCommandNum++; } } if (errorCommandNum > 0) return; for (int i = 0; i < maxLength - 1; i++) //按次執行指定命令 { p.operation(args[i], args[maxLength - 1]); }

數據的儲存是通過了在主類中定義了全局的接受變量,在執行了不同的方法之後進行賦值,然後再通過savedata方法將它們寫入至指定的目錄

Stream file = new FileStream(fileName, FileMode.Open);                      //創建文件流
                                
            char[] allChars = new char[file.Length];
            byte[] AllChars = new byte[file.Length];

            int sum = 0;
            file.Read(AllChars, 0, AllChars.Length);                                    //讀取文件中的字符至byte數組
            Decoder decoder = Encoding.Default.GetDecoder();                            //創建解碼器
            decoder.GetChars(AllChars, 0, AllChars.Length, allChars, 0);                //解碼器將byte數組解碼至char數組

最關鍵的地方在於個性化指定輸出文件的操作,如果是這樣帶參啟動,我覺得好像只能執行一次,並且馬上返回,無法再進行操作,在操作其實是重啟項目,所以最開始我設計的只能是-o xxx以後,創建一個儲存文件,但是由於儲存文件只能在類中寫死,所以其實我的方法只是創建了文件夾,並沒有解決根本性問題,所以我開始從json配置文件入手,雖然我之前在Unity開發過程中使用過Json配置方法,但是它是基於unity內置的一些API,讓json配置更符合遊戲開發,所以我並沒有接觸過原生的C#Json配置,在網上搜索了很久以後,又是下載庫,又是引用空間,但是最後發現太復雜了,在短時間我無法保證程序穩定性,所以轉而求其次,用了一種很簡單,很穩定,很方便的辦法,(但是有些low),就是我重新新建了一個TXT文件來保存文件的儲存路徑信息以及文件名,也就是savefilepath.txt這個文件,它並非已經內置與exe文件同一目錄,而是運行時根據是否有次此文件進行動態生成,而此文件中保存儲存信息文件的目錄以及文件名

if (!File.Exists("savefilepath.txt"))                                    //儲存文件路徑信息文件是否存在,否則創建      
            {
                FileStream sFP = new FileStream("savefilepath.txt", FileMode.Create);
                string savefilename = "result.txt";                                 //默認儲存文件
                byte[] filePath = Encoding.Default.GetBytes(savefilename);          
                sFP.Write(filePath, 0, filePath.Length);
                sFP.Close();
            }

而對此文件的操作我重新定義了兩個方法對它進行管理,分別是

getSaveFileName()

setSaveFileName(string fileName)

它們的功能就是對savefilepath這個文件的內容進行改寫,其實變相的實現了配置文件的作用,只是只能在這種一兩個變量的程序簡便運用,大型項目不可控因素會更加龐大

測試:

exe同目錄結構如下:

技術分享圖片

在dos介面執行以下命令後,exe同名文件發生變化

技術分享圖片

生成savapathfile儲存輸出文件夾的路徑信息,result.txt為默認輸出路徑

result.txt和savafilepath問價內容如下

技術分享圖片

技術分享圖片

執行制定文件夾輸出命令後,exe同名文件夾目錄如下

技術分享圖片

生成了新的outfile文件夾

此時再進行命令執行,以及查看outfile文件內容

技術分享圖片

實現了TXT作為配置文件的功能,可以自定義輸出路徑,並正確保存

感想:

此次實驗項目對於主要功能的實現其實很簡單,但是這樣的項目可以讓我們有效的管理我們學過的知識並加以靈活運用,就比如說帶參啟動,這在以前的編程中我從沒遇到,這樣的項目讓我知道了怎麽去帶參啟動,以及args[]數組的索引從何開始,還有就是配置文件我覺得實我收獲最大的,以前寫配置文件都是直接利用開發軟件內置的API進行配置文件的編寫,但是這一次沒有接觸C#原生的配置文件,所以可以很巧妙的運行txt來作為配置文件

wc.exe程序