C#——一个简单的文件管理器

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于epoll,select,poll的理解

select: 轮询fd_set 1.采用fd_set存储fd(fd_set通过数组位图实现) 2.每次调用select,都需要把fd集合从用户态拷贝到内核态,fd越多开销越大 3.每次调用select,都需要在内核遍历传递进来的fd,开销大(轮询&…

kali linux超级用户_如何优雅的在Linux上使用Powershell]

点击上方“蓝字”关注我们吧!译文声明本文是翻译文章,文章原作者 TJ Null文章来源:https://www.offensive-security.com原文地址:https://www.offensive-security.com/offsec/kali-linux-powershell-pentesting/译文仅供参考&…

Laravel5.5 MySQL配置、读写分离及操作

2019独角兽企业重金招聘Python工程师标准>>> Laravel 让连接不同数据库以及对数据库进行增删改查操作: 参考:http://laravelacademy.org/post/854.html 配置读写分离 应用的数据库配置位于 config/database.php(但是数据库用户及密码等敏感信…

Kinect开发笔记之八C#实现Kinect声音的追踪

声明:本文中特征多针对Kinect for windows 1.0,新版的Kinect Sensor可能有部分数值或方法有一定变化,请知晓。Kinect的声音来自下方的4个麦克风组成的麦克风阵列。传感器内含数字信号处理器,可以用来强化接受声音的清晰度同时处理…

Nginx常见配置:负载均衡、限流、缓存、黑名单和灰度发布

一、Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动、停止和重启 service nginx startservice nginx stopservice nginx restart浏览器中 输入服务器的 ip 地址&…

国服服务器_《Minecraft我的世界》第三方服务器的基本储备

今天我想单独来聊一聊Minecraft我的世界第三方服务器的发展。世外荒原玩家作品我来到头条的第一篇文章就发表了一篇我对Minecraft现状的看法,现在国服的状态对老玩家不是很友好。(这不说明国服的运营战略路线是有问题的)因此诞生了一大堆第三方服务器。世外荒原玩家…

Unity中Time.deltaTime的含义及其应用

相信Unity的开发者或者初学者都对Time.deltaTime并不陌生,我们经常会在代码中用到或者看到它,今天去官方的API文档查了一下,感觉它非常有用,所以翻译一下以引导初学者。 原文网址: file:///Applications/Unity/Unity…

unity3d曲线text文本

测试.pngusing System; using System.Collections.Generic;namespace UnityEngine.UI.Extensions {/// <summary>/// Curved text.让文本按照曲线进行显示 【注意对Image的变形 也是可以的】/// 说明&#xff1a; 对Text的操作就和 shadow 和 outline 组件类似。/// <…

HTML 和CSS

1 HTML 介绍1.1 web 服务本质import socket sk socket.socket() sk.bind(("127.0.0.1", 8080))sk.listen(5) while True: conn, addr sk.accept() data conn.recv(8096) conn.send(b"HTTP/1.1 200 OK\r\n\r\n") conn.send(b"<h1>Hello world…

Unity中Quaternion的含义及其使用

官网API文档&#xff1a; file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quaternion.html Quaternion的意思是四元数&#xff0c;用于代表旋转。 它们是紧致的&#xff0c;不会产生万向节死锁并且能够很容易被插值。Unity内使用Quat…

Python PIPEs

2019独角兽企业重金招聘Python工程师标准>>> https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm 转载于:https://my.oschina.net/zungyiu/blog/1860857

延时消息_Handler的消息延时是怎么实现的

消息延时做了什么特殊处理&#xff1f;是发送延时&#xff0c;还是消息处理延时&#xff1f;延时的精度如何&#xff1f;通常我们使用Handler的消息延时都是调用sendMessageDelayed函数实现的&#xff0c;其中delayMillis是需要延时的毫秒。通过跟踪sendMessageDelayed函数可以…

5月JC学习总结

断剑重铸之日&#xff0c;王者归来之时。为了更美好的明天而战。 五月 悄悄地过了 人儿 不觉中散了 携着一腔热血&#xff1b;来到蛟川 来到机房 微凉的轻风&#xff0c;无声地去了 炽热的骄阳&#xff0c;即将要落了 站在4楼&#xff0c;向窗外眺望&#xff0c;映出的不是夕阳…

4 关卡流 进阶_全息武器全解析,记住4个点全区第一就是你!

实不相瞒&#xff0c;每次看着全息武器糖糖都感觉自己像钢铁侠高端大气上档次&#xff0c;低调奢华有内涵那么问题来了&#xff01;这个全息武器究竟该怎么玩才能成为真正的钢铁侠&#xff1f;我的使命之全息武器【作者&#xff1a;D38激战阿曼——潜龙小生】全息武器在属性增加…

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

运行时报错&#xff1a; terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr&#xff1a;__pos Aborted (core dumped) 内存读取越界。 解释1&#xff1a;for example:const std::string sTest( "test" );sTest.substr…

记一次理想浪漫的毕旅

因为临近毕业离别的氛围和闲散的生活&#xff0c;虽然手头积攒了不少可写的素材和教程&#xff0c;但还是两个月没有在CSDN更新博客。论文答辩之后&#xff0c;我只是每天在宿舍玩玩电脑、打打扑克&#xff0c;唯一让我难受的是&#xff0c;隔几天便送走一位同窗好友。有时甚至…

【渗透过程】嘉缘网站 --测试

声明&#xff1a;本片文章测试网站为测试靶场 信息收集阶段&#xff1a; 首先使用了一些常见的扫描工具&#xff1a;nmap 御剑 使用nmap扫描端口 发现网站开放了 135 139 445 3306 等端口 这里可以看到网站开放了一些危害较高端口&#xff1a;135 225等 使用御剑扫描到一些敏感…

C编程经验总结

Turbo c Return (z);return z; 图形界面的有scanf(“%d ~%d\n”,&~,&~);注意&#xff1a;中间不能有乱的东西 Printf(“~~~ %d~~%d\n”,~,~);这儿可以有乱的东西&#xff0c;一切的提示图形界面多是由它完成 函数&#xff0c;变量一定是有类型 除了函数&#xff08;&am…

文档过期打不开怎么办_标准的产品需求文档在这里!(详细说明版)(2)

接着上篇继续写&#xff0c;上篇请点击标准的产品需求文档在这里&#xff01;(详细说明版)(1)入口已经写完&#xff0c;读此文档的无论是研发人员还是测试都已经知晓此需求需要做的从哪里进入&#xff0c;接下来就是主菜了&#xff0c;进入以后该干嘛。进入以后当然就是新的页面…

day32

udp(用户数据包协议) 高并发(同时有大量客户端访问服务器,服务器处理不过来)​OSI模型中,属于传输层得协议,仅用于不要求可靠性,以及不要求分组顺序且数据量较小的简单传输,力求快​通讯流程类似对讲机 只管发送不管对方是否接收到,甚至不关心对方存在​UDP可以处理多个客户端,…