应该知道的网站,中山专业做网站的公司,北京美的网站,欧美做爰爰爰爰网站最近在紧张的学习C##xff0c;说实话对C#之前没有太多的接触过#xff0c;只知道C#的特性与java很相似#xff0c;接触了之后才发现C#跟java相比区别不是很多#xff0c;但它是一门实现程序能力比Java还要好的语言#xff08;仅代表个人观点#xff09;。
有许多新手在…最近在紧张的学习C#说实话对C#之前没有太多的接触过只知道C#的特性与java很相似接触了之后才发现C#跟java相比区别不是很多但它是一门实现程序能力比Java还要好的语言仅代表个人观点。
有许多新手在学习编程语言的时候都会在递归上面卡住理解和应用起来会十分的吃力所以我就自己尝试用递归写了一个很简单很简单很简单的文件管理程序说它简单是因为他真的没有什么难度都是很底层的循环和递归也就只有130多行代码只是希望能够帮助大家理解应用递归。如果你一点编程基础木有那请不要直接来尝试递归和各种循环请一步步扎实的从头学起。
这个很简单很简单很简单的文件管理程序提供如下几个功能检索用户输入路径下文件的总数量检索用户输入路径下文件夹的数量检索用户输入路径下所有结尾与输入字符匹配的文件数量。这么说可能有点儿抽象先贴一张程序运行的结果图片。
我分别使用这个小程序检索了我C盘下Autodesk文件夹内的文件总数文件夹总数和txt文件总数最后退出程序。然后我来到了Autodesk文件夹右键属性了一下证实数量确实是正确的。而至于txt的数量我在文件夹窗口搜索栏输入txt一共182个结果然而我一个一个数过了有6个是开头为txt的所以176是准确无误的。如果你想要让我们代码的功能编程包含txt这三个字符而不是以这三个字符结尾只需要在后面进行简单修改这里先不赘述。
好了闲话不多说直接贴上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;//需要引入
using System.Threading;//需要引入namespace FilesManager
{class Program{//FilesNumber方法#regionstatic int FilesNumber(string path){int count 0;try{var files Directory.GetFiles(path);count files.Length;var directories Directory.GetDirectories(path);foreach (var direc in directories){count FilesNumber(direc);}}catch (UnauthorizedAccessException exception){Console.WriteLine(exception.Message);}return count;}#endregion//DirectoriesNumber方法#regionstatic int DirectoriesNumber(string path){int count 0;try{var directories Directory.GetDirectories(path);count directories.Length;foreach (var direc in directories){count DirectoriesNumber(direc);}}catch (UnauthorizedAccessException exception){Console.WriteLine(exception.Message);}return count;}#endregion//FindExtension方法#regionstatic int FindExtension(string path, string extension){int count 0;try{var files Directory.GetFiles(path);foreach (var file in files){if (file.ToLower().EndsWith(extension)) count;}var directories Directory.GetDirectories(path);foreach (var direc in directories){count FindExtension(direc, extension);}}catch (UnauthorizedAccessException exception){Console.WriteLine(exception.Message);}return count;}#endregion//Main方法#regionstatic void Main(string[] args){string path, extension, order;Thread.Sleep(1200);Console.WriteLine(程序开始Designed By Mr.Losers);Thread.Sleep(1200);Console.WriteLine(特别鸣谢何掌柜的);Thread.Sleep(1200);Console.WriteLine();Console.Write(计算路径下文件数量请输入0\n计算路径下文件夹子数请输入1\n);Console.Write(搜索路径下文件名匹配数量请输入2\n退出程序请输入q\n);do{order Console.ReadLine();if (order 0){Console.Write(文件管理系统已经就绪!\n请输入你要查找的路径:\n);path Console.ReadLine();Console.WriteLine(该路径下文件总数为{0}, FilesNumber(path));order Console.ReadLine();}if (order 1){Console.Write(文件管理系统已经就绪!\n请输入你要查找的路径:\n);path Console.ReadLine();Console.WriteLine(该路径下文件夹总数为{0}, DirectoriesNumber(path));order Console.ReadLine();}if (order 2){Console.Write(文件管理系统已经就绪!\n请输入你要查找的路径:\n);path Console.ReadLine();Console.WriteLine(请输入你想要匹配的文件名称);extension Console.ReadLine();Console.WriteLine(符合名称的文件总数为{0}, FindExtension(path, extension));order Console.ReadLine();}if (order q)break;else{Console.WriteLine(输入错误请重新输入);}}while (true);Console.Write(Thanks for using!);Thread.Sleep(2000);}#endregion}
}
贴完代码后来简单说明一下里面包含的东西。
首先要说几个点 第一个是在代码中我使用了多次varvar是C#中很方便一种用法让编译器自动判断类型。比如这里的Directory.GetFiles(path); 返回的是一个string类型的数组是包含path路径下的每个文件的路径数组。var files Directory.GetFiles()相当于string [] files Directory.GetFiles(path)
第二个是预处理指令#region和#endregion方便管理代码收起一块区域内的代码
第三个是try catch语句在本程序中我们每一个文件搜索的方法都使用了该语句因为无论是C盘还是D盘等盘符都会有文件我们是没有访问权限的所以我们要catch UnauthorizedAccessException并且把此exception的信息打印出来这样一来我们可以知道那些文件没有被进一步访问二来程序不会因为exception而中断。
第四个是我们在开始需要引入两个命名空间因为我们用到的方法Thread.Sleep()需要引入System.Threading;用到的GetFiles()和GetDirectories()需要引入System.IO;
下面我们按照顺序来看代码先来讲FilesNumber方法三个方法都使用了递归的思想此方法需要传入一个形参path既搜索的路径。count为计数器计算文件的个数。
首先对我们传入路径path中的所有文件计数所以count files.Length然后取出path中所有的directory也就是可以继续向下探索的文件夹接下来是很重要的一步——递归对每个path中取出的directory再继续执行本方法并与当前count相加得到新的count数值层层向下直到不存在可以继续向下探索的文件夹为止。
在方法中调用自己是递归的基本思路。我们假设path下有10个文件其中有3个文件夹path1path2,path3,那实际上这段代码的执行过程是count(path) path路径下的文件数量countpath1countrypath2count(path3)然后path1,path2,path3内还有文件和文件夹于是分解仍在继续。
举一个数学例子帮助大家理解 128 64 64 64 32 32) 64 ((1616)(1616)) 64 (((88)(88))((88)(88))),虽然不完全一样 但道理是差不多的都是一个层层分解的过程。我已经用生命在解释了还是没懂得请多思考思考或者另谋高就把。。。。
解释完了FilesNumber的话DirectoriesNumnber是比FilesNumber还要简单的同样使用了递归的方法这就略过了。
FindExtension方法只是做了些许的改变首先方法传入两个参数一个路径path一个匹配的扩展名extension这里注意我使用的两个方法ToLower方法确保了大小写的匹配文件都可以找到EndsWith()是后端匹配当然我们也可以使用StartWith()和Contains()如果你搜索的文件数量很少并且我们还可以找到文件后输入它当前的路径这些就交给读者自己去修改吧其实是比较简单的我为了保证程序的简洁就没有输出路径100多条路径一下输出出来也是挺痛苦的。
接下来来到Main方法注意Java中Main方法都是小写的main而C#中需要大写。
Main方法的前半部分都是定义和输出使用方法。因为我有一点儿轻微的强迫症认为输出时加入延迟会让人感觉更加舒服并且会认真看屏幕上出现的字。所以我加入了Sleep方法我一开始设定的是Sleep2000毫秒你敢信。。。。
在输出文字后的do while循环才是程序的主体。其实完全可以改用while只是不知道为啥我写的时候用了个do while你会发现我后面while的条件是true也就是他会一直执行直到用户输入Q后break出来。。。。。
这个循环中首先会要求你输入根据前面提示用户会知道输入0、1、2、q来选择功能然后程序会根据用户输入不同的字符来执行不通的功能即调用不同的方法执行之后立刻重置以准备下一次使用。因为输入的是字符串我就没有转换为int类型然后使用switch语句。
其实现在仔细看看这个程序真的是很简单很简单很简单的最简单的递归最简单的循环所以我们不得不赞叹代码真的是很神奇的东西我到现在还记得前两天把这个小东西给不懂编程的女票何掌柜看的时候她竟然以为这个小程序很强大能卖钱也是秀逗了。
最后还是希望能够帮到大家C#真的是一门很好的语言。
另如果大家发现了一些错误或者有更好的改进还请不吝赐教请邮箱、私信或者微博联系我。
2015.4.5 1539 By Mr.Losers