zoukankan      html  css  js  c++  java
  • .Net 4.0中IO操作的增强

    在.Net 4.0中增加了一系列较为实用的IO功能,下面让我们来一起看一下吧:

    1. Stream.CopyTo

    Stream.CopyTo在用于较小的Stream之间的拷贝时还是比较方便的,有了它后我就不用为这个简单的功能而再写一个扩展函数了。当然,这个函数不适合于大型的Stream的拷贝(延迟太高),要是微软肯再加上一个带进度的就更好了。O(∩_∩)O~

    2. File.ReadLines和File.WriteAllLines

    在.Net 2.0时代,当我们读一个文本文件的时候,往往是用的File.ReadAllLines方法读取所有的行,然后通过遍历所有行来进行相关的文件操作,如下所示:

        var lines = File.ReadAllLines("1.txt");
        foreach (var line in lines)
        {
            //....
        }

    这种方式简单有效,但也存在一个非常严重的问题:当文件很大的时候,读取所有行需要占用大量的时间和内存。并且如果我们若只需要在文件中查询部分内容的时候,也无法在读到有效内容后放弃继续读取。当然,这些不足可以通过StreamReader来解决,如下所示:

        using (var reader = new StreamReader("1.txt"))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                //...
            }
        }

    但这个方法显然不如上面的File.ReadAllLines来的直观方便,并且还牵涉到Stream资源无法及时释放的隐患。

    在.Net 4.0中,引入了File.ReadLines函数,该函数使用方式与File.ReadAllLines是一致的:

        var lines = File.ReadLines("1.txt");
        foreach (var line in lines)
        {
            //....
        }

    File.ReadAllLines不同的是:File.ReadAllLines返回的是string[],而File.ReadLines返回的是IEnumerable<string>。也就是说,File.ReadLines是延迟执行的,在保持着File.ReadAllLines的简单直观的特点同时,没有其在处理大文件时候性能方面的不足,完全可以取代File.ReadAllLines函数。

    与其对应的,File.WriteAllLines也增加了支持IEnumerable<string>的入参的重载形式,同样解决了的大文本的写入时的性能问题。

    3. 遍历文件夹

    在.Net 2.0中,要获取某个文件夹中包括子文件夹的所有的文件时,可以简单地通过Directory.GetFiles的实现:

        Directory.GetFiles(@"R:\","*.*", SearchOption.AllDirectories);

    但我们却大多不采取这种方法,因为在无法预计其文件的数量情况下,这个方法带来的高延时和高内存占用往往会导致程序或用户的崩溃。

    在.Net 4.0中,为Directory类增加了三个遍历用的方法:

        Directory.EnumerateFiles
        Directory.EnumerateDirectories
        Directory.EnumerateFileSystemEntries

    和上面的File.ReadLines一样,主要是为了解决海量查询时的性能问题的,和LINQ配合使用则更是如虎添翼。由于使用方法和之前的Get系列毫无二致,这里就不介绍了。

    4. 内存映射文件

    内存映射文件的概念在Windows早就存在,在进程间大量数据交互时无疑是最高效的手段,以前要使用它只能通过调用API来实现,现在.Net 4.0已经内置了其的支持,使用起来还是非常方便的。一个简单示例如下:

        using (var file = MemoryMappedFile.CreateNew("MemoryMappedFile", 1024))
        {
            using (var bw = new BinaryWriter(file.CreateViewStream()))
            {
                bw.Write("hello world");

                Console.ReadKey();
            }
        }

        using (MemoryMappedFile file = MemoryMappedFile.OpenExisting("MemoryMappedFile"))
        {
            using (BinaryReader br = new BinaryReader(file.CreateViewStream()))
            {
                Console.WriteLine(br.ReadString());
            }
        }

    内存映射文件的作用非常多,关于介绍这方面的文章网上也有许多,有兴趣的朋友可以参看一下这个链接:http://webservices.ctocio.com.cn/net/62/9129562.shtml

  • 相关阅读:
    增强型window.showModalDialog弹出模态窗口数据传递高度封装实验 西安
    谈谈Asp.net网站优化二:关于 服务器控件 和 客户端控件(html标签)的选择 西安
    谈谈Asp.net网站优化一:SqlDataReader和DataSet的选择 西安
    我2年来整理的.NET开发类库源代码共享 西安
    类似baidu google分页器效果的代码(修改于 kwklover 同学基础上) 西安
    C#.NET动手开发域名抢注前检测工具。 西安
    解决vs2008 项目文件(b/s)右键“在浏览器中打开”出现两个浏览器 西安
    基于Json的Ajax无刷新分页效果实现(一) 西安
    基于Json的Ajax无刷新分页效果实现(二) 西安
    循环冗余检验 (CRC) 算法原理
  • 原文地址:https://www.cnblogs.com/TianFang/p/1664680.html
Copyright © 2011-2022 走看看