wc.exe程序

Posted xiecangxing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wc.exe程序相关的知识,希望对你有一定的参考价值。

摘要

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

并且直接使用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程序的主要内容,如果未能解决你的问题,请参考以下文章

第二次,模仿wc.exe的功能

软件工程第二周 WC程序

wc.exe

python 实现 wc.exe

Java 实现 WC.exe

Java实现WC.exe功能