zoukankan      html  css  js  c++  java
  • IO异步,读写压缩文件,监控文件系统

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

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

  • 相关阅读:
    repadmin example.
    在 Windows 2000 和 Windows XP 中重置计算机帐户
    管理活动目录
    使用AdsiEdit工具查看GC数据
    mms链接media player 9.0无法打开
    活动目录的复制之细节
    使用Repadmin.exe 对活动目录复制排错
    Difference among Domain Local Group and Global Group and Universal Group
    使用 ADSI Edit 编辑 Active Directory 属性
    xp的密码工具
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13621674.html
Copyright © 2011-2022 走看看