平时很少用到文件操作和流,所以每次用的时候都是百度,不明不白,Copy过去就行了,中间也有去整理,由于没有记笔记,用得少,一段时间又忘记了。这次来一次彻彻底底的梳理。
一、继承关系图
二、文件和文件夹操作类
File和FileInfo:是文件操作类,可以对文件进行创建、修改、删除、移动等,只要对文件能进行的操作都有提供。
Directory和DirectoryInfo:是文件夹操作类,提供了创建、删除、移动文件夹,获取文件夹的子文件夹等。
其中File和Directory都是静态类。区别在于File和Directory在操作同一个文件/文件夹的时候,每次都会进行安全检查。而FileInfo和DirectoreyInfo在操作同一个文件/文件夹的时间,只会检查一次。
三、Writer操作类
Writer相关类:
顾名思义,Writer相关类都是写入到流、字符串中。下面几种Writer就与之对应。
3.1 BinaryWriter:
构造函数需要传递Stream,而BinaryWriter就是将二进制写入到此流中去,如果这个流是通过文件获得,则文件就会写到文件中。如果流通过内存获得,就会写入到内存中。
byte[] data = new byte[10]; using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(@"c:1.txt", FileMode.Create)))//流从文件中获取,写入流也就是写入文件 { binaryWriter.Write("a"); binaryWriter.Write(56); binaryWriter.Write(false); binaryWriter.Write(data); binaryWriter.Write('b'); binaryWriter.Flush(); } using (MemoryStream memoryStream = new MemoryStream())//流从内存中获取,写入流也就是写入内存中 { BinaryWriter binaryWriter = new BinaryWriter(memoryStream); binaryWriter.Write("a"); binaryWriter.Write(56); binaryWriter.Write(false); binaryWriter.Write(data); binaryWriter.Write('b'); binaryWriter.Flush(); data = new byte[10]; memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.Read(data, 0, (int)memoryStream.Length); }
3.2 StreamWriter:
构造函数需要传递Stream或者文件路径。跟BinaryWriter很像,主要方法也是Write方法,而且他的Write方法跟BinaryWriter一样,它的写入对象也是流。
using (StreamWriter streamWriter = new StreamWriter(File.Open(@"c:3.txt", FileMode.Create))) { streamWriter.Write("a"); streamWriter.Write(56); streamWriter.Write(false); streamWriter.Write(data); streamWriter.Write('b'); streamWriter.Flush(); }
StreamWriter和BinaryWriter的区别:
BinaryWriter:查看源码可以看到,在写入流之前,会将Int、Double、decimal、long、float的值转为字节数组,然后写入文件流。在写入string类型的,会将String类型变为四个无符号整数,这就导致在打开二进制文本的时候前面多个0100 打开文本显示的是ETO。BinaryWriter本质上将二进制写入流中。
StreamWriter:所见即所得。你写入文件中流的内容,打开文件和你看到的一样。而BinaryWriter写入到文件,打开是会乱码的。
3.3 StringWriter:
构造函数需要传递StringBuilder,将数据写入到StringBuilder中。所以StringWriter只能对字符串操作。
四、Reader操作类
跟Writer类似,相反,就不过多少了。