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

异步操作文件:

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

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

private async static Task<string> 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<string> 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,我们需要为这四个事件添加事件处理程序,当监控到特定行为时,就会触发相应的事件。

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

最新文章

  1. 学习笔记-----Android的View绘制过程
  2. CSS hack前传——背景图片全屏
  3. 关于fill_parent,match_parent和wrap_content (转载)
  4. ide编辑器
  5. C#操作Office.word(二)
  6. 初步C++类模板学习笔记
  7. python 算法练习
  8. LoadRunner 调用Dll完成加密解密
  9. 深入理解IOC
  10. npm -v;报错 cannot find module &quot;wrapp&quot;
  11. 使用VsCode自带的Emmet语法
  12. 学习笔记TF023:下载、缓存、属性字典、惰性属性、覆盖数据流图、资源
  13. Leetcode 546. Remove Boxes
  14. easyradius通讯接口 V4全新升级,显示同步失败原因,方便用户寻找故障
  15. 【C】——网络编程-聊天室
  16. Linux 搭建Hadoop集群错误锦集
  17. JavaScript 纯粹对象
  18. instanceof 与typeof的用法
  19. Qt C++ libcaffe.so无法调用
  20. VIRTIO概述和基本原理

热门文章

  1. API管理工具
  2. python-顺序串基本操作的实现
  3. Java 8 Stream API 详解
  4. 使用C# (.NET Core) 实现命令设计模式 (Command Pattern)
  5. 错误提示:Access denied for user &#39;GC&#39;@&#39;localhost&#39; (using password: YES)
  6. iNeuOS工业互联平台,发布:消息管理、子用户权限管理、元件移动事件、联动控制和油表饼状图,v3.4版本
  7. Androi Studio 之 LinearLayout
  8. HTML总结篇
  9. [矩阵乘法] PKU3233 Matrix Power Series
  10. SQL语句练习(进阶版)