IO异步,读写压缩文件,监控文件系统
发布日期:2021-05-17 02:03:17 浏览次数:19 分类:博客文章

本文共 2002 字,大约阅读时间需要 6 分钟。

这节结尾IO,讲一下异步操作文件,读写压缩文件,监控文件系统这三个知识点。

    

    异步操作文件:

    说到异步,必然要了解的是async和await这两个关键字(异步详情点击这篇文章进行了解),此段讲解对于初学者可以简单涉猎,接下来进入正题,在操作大文件的时候,必然要消耗大量的时间,同步情况下,必然会阻塞程序执行,所以.NET 4.5以后,对FileStream和StreamReader/Writer的读写文件方法加入了异步版本,从而在操作大文件时解放对主线程的阻塞,我们可以通过Async后缀来区分哪是异步的,如FileStream的ReadAsync()是Read()的异步版本。

    使用异步,需要将异步的逻辑封装到一个方法中,下面演示代码,代码逻辑跟FileStream的演示代码一样:

private async static Task
ReadFile(FileStream fs){ int len, i = 0; byte[] buffer = new byte[5]; byte[] data = new byte[fs.Length]; while ((len =await fs.ReadAsync(buffer, 0, buffer.Length)) != 0) { for (int j = 0; j < len; j++) { data[i++] = buffer[j]; } } return Encoding.UTF8.GetString(data);}

 接下来在主方法中调用:

FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read);Task
file = ReadFile(fs);file.ContinueWith(t =>{ Console.WriteLine(t.Result);});

运行结果就是整个文件的所有文本。其它的异步方法我就不一一演示了。

 

    读写压缩文件:

    我们都用过压缩软件压缩文件,压缩文件的原理大体上可以理解为通过算法把重复的数据清除,解压缩就是通过算法把清除的重复数据复原。.NET给我们提供了两个用于压缩的类:GZipStream和DeflateStream,它们存在于System.IO.Compression这个命名空间下,这两个类用法都差不多,而且都是公开免费的,下面简单通过代码介绍一下如何压缩一个文件,至于更高级的一次压缩多个文件,读者可以自行查阅相关文档。

//目标文件StreamReader sr=new StreamReader("./demo.txt");//压缩后文件FileStream fw=new FileStream("./demo_zip.txt.zip",FileMode.OpenOrCreate,FileAccess.Write);//基于FileStream创建压缩对象GZipStream gs=new GZipStream(fw,CompressionMode.Compress);//写入压缩后的数据StreamWriter sw=new StreamWriter(gs);string data=string.Empty;while ((data=sr.ReadLine())!=null){    sw.Write(data);}//必须关闭写入对象,否则会导致压缩文件失败sw.Close();

运行完成后,可以看一下两个文件的大小:

 在创建压缩对象的时候,第二个参数是CompressionMode枚举,它有两个成员:Compress和Decompress,指定是压缩还是解压缩,解压缩的方式跟压缩一样,此处不再赘述。

 

    监控文件系统:

    .NET 提供了一个FilSystemWatcher类用于监控文件系统,何为监控文件系统呢,就是监控文件或者目录的操作,当用户进行某项操作时,监控对象会调用对应的方法,这跟事件及其响应机制是一样的模式。

    本节对此不做代码演示,主要讲解一下FileSystemWatcher类的一些属性:

    Path:设置要监控的文件位置或者目录

    NotifyFilter:枚举,指示要监控的内容,可以通过OR运算符进行枚举合并

    Filter:指定要监控哪些文件:如*.txt

    FilSystemWatcher类有四个事件:Changed,Created,Deleted,Renamed,我们需要为这四个事件添加事件处理程序,当监控到特定行为时,就会触发相应的事件。

 

这是我的公众号二维码,获取最新文章,请关注此号

上一篇:Python最简单的图片爬虫,20行代码带你爬遍整个网站
下一篇:StreamReader & StreamWriter

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月27日 17时35分09秒