zoukankan      html  css  js  c++  java
  • C#之IO类库(二)——读写文件

    我们能够利用C#的IO库进行文件,文本的读写操作,一般的操作是先打开文件,进行读写操作,再关闭文件。其中打开文件的操作可以通过FileInfo对象进行,也可以通过File类进行,但是更常用和方便的是用File类进行,所以本文将只介绍用File类打开文件的方法。

    一.文件的简单读写操作
    如果你只想打开文件简单的读写,File类提供了一些函数能够一条语句就完成打开文件,读或写,关闭文件等操作:
    1.读取文件内容
    下面的方法都将先打开文件,读取并关闭文件,文件不存在将会报错
    ReadAllBytes:以字节数组byte[]的形式获取文件内容
    ReadAllLines:以字符串数组string[]的形式获取文件内容,可以指定编码形式,如果不指定编码,将尝试自动检测文件的编码
    ReadAllText: 以字符串string的形式获取文件内容,可以指定编码形式,如果不指定编码,将尝试自动检测文件的编码
    ReadLines:返回IEnumerable<string>形式的字符串数组,这样可以用如下的方式一行行的访问文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码
    foreach (string line in File.ReadLines(@"c:\jingle\test.txt"))
    {
      Console.WriteLine(line);
    }

    2.写入文件内容
    下面的方法都将先新建文件并打开,写入并关闭文件,如果文件存在将覆盖原文件
    WriteAllBytes:以字节数组byte[]的形式写入文件内容
    WriteAllLines:以字符串数组string[]或IEnumerable<string>的形式写入文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码
    WriteAllText:以字符串string的形式获取文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码

    3.添加文件内容
    下面的方法都将先打开文件,添加内容并关闭文件,文件不存在将会新建文件
    AppendAllLines:以字符串数组string[]或IEnumerable<string>的形式写入文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码
    AppendAllText:以字符串string的形式获取文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码

    二.用FileStream操作文本内容
    FileStream继承自Stream
    1.创建FileStream
    File类提供了一些将文件打开成FileStream的函数
    public static FileStream Open(
     string path
     FileMode mode,
     FileAccess access,
     FileShare share
    )
    mode可以为Open,Create,append,
    access可以为Read, Write, 或ReadWrite
    share,文件可以用以下几种共享模式打开:
    a.None:不管文件以什么权限打开,在关闭文件前都不能再打开
    b.Read:当文件打开时,只能以读的权限再次打开
    c.Write:当文件打开时,只能以写的权限再次打开
    d.ReadWrite:当文件打开时,还可以以写或读的权限再次打开

    public static FileStream Create(
     string path,
     int bufferSize,
     FileOptions options,
     FileSecurity fileSecurity
    )
    options的值可以为以下选项的或值
    a.None
    b.WriteThrough 表明写的内容不用缓存,直接存入文件
    c.Asynchronous 表明文件可异步读写
    d.RandomAccess 表明文件可以随机访问
    e.DeleteOnClose 表明文件不使用后会自动删除
    f.SequentialScan 表明文件只能顺序访问,在读很大的文件时能提高效率
    g.Encrypted 表明文件被加密

    OpenRead:
    等价于Open(path, FileMode.Open,FileAccess.Read,FileShare.Read)

    OpenWrite:
    等价于Open(path, FileMode.OpenOrCreate,FileAccess.Write,FileShare.None)

    另外还可以直接新建FileStream。

    2.读写操作
    可使用CopyTo,Read,Write,writebyte等函数写入字节数组.
    写入后用Flush函数清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。
    如果想要撤销某些写入的数据,可以使用SetLength函数

    3.定位
    用Seek(
     long offset,
     SeekOrigin origin
    )
    函数来进行定位。
    用origin来表明查找的起始位置是在文件头,文件尾,还是当前位置。
    offset是相对于origin位置的便宜。

    用Position直接定位

    4.判断是否读到文件尾
    通过比较Length和Position属性来判断是否是文件尾

    5.异步读写
    当操作的文本太大,需要进行异步读写以提高性能
    要进行异步读写,首先文本需要用异步的方式打开
    a.可使用 FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) 函数,以异步方式打开
    b.可通过设置FileOptions参数,以异步方式打开

    有的平台不支持异步打开,所以我们可以用IsAsync属性判断是否成功异步打开了。

    从.NET Framework 4.5开始支持用CopyToAsync,ReadAsync,WriteAsync,FlushAsync来进行异步读写。

    .NET Framework 4.5之前用BeginRead,BeginWrite,EndRead,EndWrite函数来进行异步读写。


    三.用StreamReader读文件
    StreamReader继承自TextReader
    1.创建StreamReader
    a.使用File.OpenText函数以UTF-8编码打开并返回StreamReader对象
    b.用Stream创建StreamReader对象,这种创建方法让我们能方便的读取其他的Stream对象。
    c.用文件路径创建StreamReader对象

    2.读操作
    Read():读一个字符。
    Read(Char[], Int32, Int32):从当前流中将指定的最多个字符读到指定索引位置开始的缓冲区。
    ReadBlock:Read的block版本
    ReadLine:读取一行字符
    ReadToEnd:读所有字符

    3.预读
    在文本处理中经常希望预先知道下面要读的内容,StreamReader提供了两个很有用的函数
    EndOfStream判断是否是文件尾
    Peek返回下一个字符,但是不改变当前位置,如果没有要读取的字符或该流不支持查找,则为-1

    4.定位
    用BaseStream返回基本流来进行定位
    但是如果已经进行了读取操作,内部缓冲区和BaseStream的位置不一致,这时需要用DiscardBufferedData函数来令两者一致后再进行定位。
    reader.DiscardBufferedData();
    reader.BaseStream.Location = 8;

    5.异步读
    从.NET Framework 4.5开始支持用ReadAsync,ReadBlockAsync,ReadLineAsync,ReadToEndAsync来进行异步读。

    四.用StreamWriter写文件
    1.创建StreamWriter
    a.使用File.AppendText函数以UTF-8编码打开并返回StreamWriter对象
    b.使用File.CreateText函数以UTF-8编码打开并返回StreamWriter对象
    c.用Stream创建StreamWriter对象,这种创建方法让我们能方便的写入其他的Stream对象。
    d.用文件路径创建StreamWriter对象

    2.写操作
    a.支持用Write和WriteLine函数直接写入Boolean,Decimal,Double,Int32,Int64,UInt32,UInt64,Single,Char,Object,Char[],String等数据
    b.支持用Write和WriteLine函数格式化写内容,格式化参见http://msdn.microsoft.com/zh-cn/library/26etazsy.aspx
    c.写入后用Flush函数清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。如果将AutoFlush属性设为true,则能自动Flush

    3.定义行结束符
    我们可以用NewLine属性来定义自己想要的行结束符

    4.异步写
    从.NET Framework 4.5开始支持用WriteAsync,WriteLineAsync来进行异步写。



    作者:Jingle Guo
    出处:http://www.cnblogs.com/studynote/
    若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    PHP基础介绍
    day96
    day95
    day94
    day93
    day93之微信推送
    22个必须知道的css技巧
    利用Js或Css滤镜实现IE6中PNG图片半透明效果 IE6PNG妥妥的
    dedecms调用日期格式化形式大全
    innerHTML动态添加html代码和脚本兼容性问题处理方法
  • 原文地址:https://www.cnblogs.com/studynote/p/3013595.html
Copyright © 2011-2022 走看看