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/
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/studynote/p/3013595.html