关于wc.exe程序处理文件字符,单词数,行数

Gitee项目地址:https://gitee.com/xiecangxing/wc.git

本项目我只实现了基本功能,也就是文件的字符总数,单词总数,以及行数的计算,以及输出至哪个文件

并且直接使用C#语言进行编写

整个项目我集中在一个主类和一个主方法当中

以及十个方法,分别完成相应的任务,较为符合单一原则分别为

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()                 测试

最开始采用的其实是控制台直接输入参数的方法,并且写入了较为友好的文字提示信息,但是最后发现和要求不太一样,所以又改变为doc界面带参启动的运行方式,利用args[]娶到带参数启动的参数,并且·根据args进行命令行以及文件名判断

部分代码如下

 
            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]);
            }

然后计算字符数以及单词,行数,直接引用了System.IO,然后创建了文件流,对文件进行操作,把文件读入至byte数组,然后再通过解码器读至char数组,再对每一个元素进行甄别

部分代码如下:

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数组

数据的储存是通过了在主类中定义了全局的接受变量,在执行了不同的方法之后进行赋值,然后再通过savedata方法将它们写入至指定的目录

最关键的地方在于个性化指定输出文件的操作,如果是这样带参启动,我觉得好像只能执行一次,并且马上返回,无法再进行操作,在操作其实是重启项目,所以最开始我设计的只能是-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这个文件的内容进行改写,其实变相的实现了配置文件的作用,只是只能在这种一两个变量的程序简便运用,大型项目不可控因素会更加庞大

到此,这个项目基本完成,其他的基础就不多赘述了。

 

 

posted @ 2018-09-23 20:16  谢沧行  阅读(232)  评论(0编辑  收藏  举报