最近在紧张的学习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}
}

贴完代码后,来简单说明一下里面包含的东西。

首先要说几个点:
第一个是在代码中我使用了多次var,var是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个文件夹path1,path2,path3,那实际上这段代码的执行过程是:count(path)= path路径下的文件数量+count(path1)+country(path2)+count(path3),然后path1,path2,path3内还有文件和文件夹,于是分解仍在继续。

举一个数学例子帮助大家理解:
128 = 64 + 64 = 64 + (32 +32)= 64 + ((16+16)+(16+16))= 64 + (((8+8)+(8+8))+((8+8)+(8+8))),虽然不完全一样,
但道理是差不多的,都是一个层层分解的过程。我已经用生命在解释了,还是没懂得请多思考思考,或者另谋高就把。。。。

解释完了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 15:39
By Mr.Losers

C#——一个简单的文件管理器相关推荐

  1. java做一个简单的文件管理器

    前言 马上大四了,在大三结束后进入一家国企的研发组工作,短短的两个月实习大部分时间都是在自己学习.最近几天突然有点困倦,决定把之前做的一些东西分享出来. 目的与内容 运用面向对象程序设计思想,基于Ja ...

  2. python写一个文件下载器_python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  3. 利用MFC调用libvlc.dll作一个简单的播放器

    简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了. 2009.10.29修改:加入c ...

  4. spring诸如方式_一个简单的步进器,具有诸如下一步,返回和结束之类的简单动作,可以执行简单的表格

    spring诸如方式 Vue步进器. (Stepper for Vue.) A simple stepper with simple actions such as next, back and fi ...

  5. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  6. ROS2学习笔记13--编写一个简单的发布器和侦听器(C++)

    概要:这篇主要介绍编写发布器和侦听器的简单套路(C++) 环境:ubuntu20.04,ros2-foxy,vscode 最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现. 2. ...

  7. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  8. 一个简单的视频播放器

    本文介绍一个简单的视频播放器的实现,主要功能是读取U盘视频文件,通过UI显示进行播放,包括UI的一些控制逻辑,由于以demo的形式实现,因此UI设计效果比较一般,主要实现对应的功能,下面就简单介绍下整 ...

  9. 使用掌控版制作一个简单的抢答器

    前几天老师布置的作业,要求我们做一个简单的抢答器,我用了掌控版,软件用的是mind+. 这个图形化编程软件简单易懂,容易操作. 这里用到三个掌控版,一个模拟主持人(也就是出题方),另外俩个模拟抢答端. ...

最新文章

  1. WSFC2016 SMB多通道与网络调校
  2. spring beans源码解读之--Bean的注解(annotation)
  3. CentOS bug修复指令集(阿里云漏洞修复方法)
  4. mysql修改密码后phpmyadmin 出现#1045
  5. 一朝清明不若鸿蒙什么意思,清明节得名并非源于“气清景明”
  6. [html] html5中的meta标签robots有什么作用?
  7. H3C交换机设置DHCP中继,配合Linux 服务器为多VLAN提供DHCP地址分配服务
  8. kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤
  9. (35)Gulp 构建任务组合
  10. php评论倒序 zblog_ZblogPHP调用最新、评论最多、浏览最多、置顶文章
  11. 数学一年级应用题_小学一年级数学应用题100道
  12. 用算法判断输入的一个数是几位数
  13. 大数据小项目之电视收视率企业项目09--hive环境搭建
  14. CondaHTTPError: HTTP 404 NOT FOUND for url <https://repo.anaconda.com/pkgs/main/noarch/repodata.json
  15. 【Python数据分析与可视化】期末复习试题集
  16. matplotlib画小米新LOGO
  17. Telegram的tdesktop之Windows编译小记
  18. Pr 案例:制作快闪转场效果
  19. MySQL数据导入1026报错问题
  20. 【案例分析】服务器数据恢复

热门文章

  1. kafka java api 删除_使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)...
  2. php字符串转换mysql_在PHP中将字符串转换为MySQL时间戳格式
  3. Java给定一个字符串数组,判断每个字符出现次数
  4. 善用工具_如何善用色彩心理学
  5. 制作五彩纸屑转场动效_何时以及如何将五彩纸屑添加到产品UI
  6. BMP位图之8位位图(三)
  7. android.support不统一的问题
  8. IIS 日志文件位置
  9. [转]收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
  10. KeyMob应用开发者服务平台帮助开发者推广和盈利