C#(文件操作)

1.文件系统

下面的类用于浏览文件系统和执行操作,比如移动,复制和删除文件。
System.MarshalByRefObject 这个是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据。
FileSystemInfo 这是表示任何文件系统对象的基类
FileInfo和File 这些类表示文件系统上的文件
DirectoryInfo和Directory 表示文件系统上的文件夹
Path 包含用于处理路径名的一些静态方法
DriveInfo 它的属性和方法提供了指定驱动器的信息

2.表示文件和文件夹的.NET类

我们有两个用于表示文件夹的类和两个用于表示文件的类
Directory(文件夹)和File(文件)类只包含静态方法,不能被实例化。如果只对文件夹或文件执行一个操作,使用这些类就很有效,省去了去实例化.NET类的系统开销。
DirectoryInfo类和FileInfo类实现与Directory和File相同的公共方法,他们拥有一些公共属性和构造函数,这些类的成员都不是静态的。需要实例化这些类,之后把每个实例与特定的文件夹或者文件关联起来。如果使用同一个对象执行多个操作,使用这些类比较合适,这是因为在构造的时候他们将读取合适文件系统对象的身份验证和其他信息,无论每个对象调用了多少方法,都不需要再次读取这些信息。

FileInfo和DirectoryInfo类

对于FileInfo和DirectoryInfo类中的很多方法也可以使用File和Directory中的很多方法实现。

1,完成一个文件的拷贝
FileInfo myFile = new FileInfo(@“c:\pxx\xx\xxx\xxx.txt”);
myFile.CopyTo(@“d:\xx\xx.txt”);//拷贝文件
对应的File处理方式
File.Copy(@“c:\xxx\xx\xx\xx.txt”,@“d:\xx\xx\xx.txt”);

2,判断一个文件夹是否存在
DirectoryInfo myFolder = new DirectoryInfo(@“c:\program files”);
myFolder.Exists

对于FileInfo,或者DirectoryInfo进行构造的时候,如果传递了一个不存在的文件或者文件夹路径,这个时候不会出现异常,只有当你使用这个文件或者文件夹的时候才会出现问题。
FileInfo和DirectoryInfo的对象都可以通过Exists属性判断这个文件或者文件夹是否存在。

FileInfo和DirectoryInfo的属性列表

CreationTime 创建文件或文件夹的时间
DirectoryName(用于FileInfo) 包含文件夹的完整路径
Parent(用于DirectoryInfo) 指定子目录的父目录
Exists 文件或文件夹是否存在
Extension 文件的扩展名,对于文件夹,它返回空白
FullName 文件或文件夹的完整路径名
LastAccessTime 最后一次访问文件或文件夹的时间
LastWriteTime 最后一个修改文件或文件夹的时间
Name 文件或文件夹的名称
Root(仅用于DirectoryInfo) 路径的根部分
Length(仅用于FileInfo) 返回文件的大小(以字节为单位)

FileInfo和DirectoryInfo的方法列表

Create() 创建给定名称的文件夹或者空文件,对于FileInfo,该方法会返回一个流对象,以便于写入文件。
Delete() 删除文件或文件夹。对于文件夹有一个可以递归的Delete选项
MoveTo() 移动或重命名文件或文件夹
CopyTo() (只用于FileInfo)复制文件,文件夹没有复制方法,如果想要复制完整的目录树,需要单独复制每个文件和文件夹
GetDirectories() (只适用于DirectoryInfo)返回DirectoryInfo对象数组,该数组表示文件夹中包含的所有文件夹
GetFiles() (只适用于DirectoryInfo)返回FileInfo对象数组,该数组表示文件夹中所有的文件
GetFileSystemInfos() (只适用于DirectoryInfo)返回FileInfo和DirectoryInfo对象,它把文件夹中包含的所有对象表示为一个FileSystemInfo引用数组

3.Path类

我们不能去实例化Path类,Path类提供了一些静态方法,可以更容易的对路径名执行操作。
Console.WriteLine(Path.Combine(@“c:\my documents”,“Readme.txt”));
在不同的操作系统上,路径的表示是不一样的 windows上是 \ , 在Unix就是/ ,我们可以使用Path.Combine连接两个路径,不用关心在哪个系统上。

Path类的一些静态字段

AltDirectorySeparatorChar 提供分割目录的字符,在windows上使用 \ 在Unix上用 /
DirectorySpeparatorChar 提供分割目录的字符,在windows上使用 / 在Unix上用
PathSeparator 提供一种与平台无关的方式,来指定划分环境变量的路径字符串,默认为分号
VolumeSepartorChar 提供一种与平台无关的方式,来指定容量分割符,默认为冒号

4.读写文件

在.NET 2.0扩展了File类,通过File可以读写文件。

在.NET 2.0扩展了File类,通过File可以读写文件。
1,File.ReadAllText(FilePath); 根据文件路径读取文件中所有的文本
2,File.ReadAllText(FilePath,Encoding); Encoding可以指定一个编码格式
Encoding.ASCII;

3,File.ReadAllBytes() 可以打开二进制文件把内容读入一个字节数组
4,File.ReadAllLines() 以行的形式读取文件,一行一个字符串,返回一个字符串的数组

我们读取文件有ReadAllText() ReadAllLines()和ReadAllBytes()这几个方法,对应的写入文件的方法有WriteAllText() WriteAllLines()和WriteAllBytes()

5.流

流是一个用于传输数据的对象,数据可以向两个方向传输:
如果数据从外部源传输到程序中,这就是读取流
如果数据从程序传输到外部源中,这就是写入流
外部源可能是
一个文件
网络上的数据
内存区域上
读写到命名管道上

读写内存使用System.IO.MemorySystem
处理网络数据使用System.Net.Sockets.NetworkStream

与流相关的类

C#(文件操作)
FileStream(文件流) 这个类主要用于二进制文件中读写,也可以使用它读写任何文件。
StreamReader(流读取器)和StreamWriter(流写入器)专门用于读写文本文件

6.使用FileStream类读写二进制文件

FileStream实例用于读写文件中的数据,要构造FileStream实例,需要提供下面的4中信息:
要访问的文件 - 一般提供一个文件的完整路径名
表示如何打开文件的模式 - 新建文件或打开一个现有文件,如果打开一个现有的文件,写入操作是覆盖文件原来的内容,还是追加到文件的末尾?
表示访问文件的方式 - 只读 只写 还是读写
共享访问 - 表示是否独占访问文件,如果允许其他流同时访问文件,则这些流是只读 只写 还是读写文件

构造函数的参数

构造函数的参数的取值
FileMode( 打开模式) Append,Create,CreateNew,Open,OpenOrCreate和Truncate
FileAccess(读取还是写入) Read,ReadWrite和Write
FileShare(文件共享设置) Delete,Inheritable,None,Read,ReadWrite和Write
注意
如果文件不存在 Append Open和Truncate会抛出异常
如果文件存在 CreateNew会抛出异常
Create 和 OpenOrCreate Create会删除现有的文件,新建一个空的文件,OpenOrCreate会判断当前是否有文件,没有的话才会创建

创建FileStream文件流

FileStream fs = new FileStream(@“c:\xx\xx.doc”,FileMode.Create);
FileStream fs2 = new FileStream(@“c:\xx\xx.doc”,FileAccess.Write);
FileStream fs3 = new FileStream(@“c:\xx\xx.doc”,FileAccess.Write,FileShare.None);

通过FileInfo打开文件流
FileInfo myfile1 = new FileInfo(@“c:\xx\xx.doc”);
FileStream fs4= myfile1.OpenRead();
FileInfo myfile2 = new FileInfo(@“c:\xx\xx.doc”);
FileStream fs5= myfile2.OpenWrite();
FileInfo myfile3 = new FileInfo(@“c:\xx\xx.doc”);
FileStream fs6= myfile3.Open(FileMode.Append,FileAccess.Write,FileShare.None);
FileInfo myfile4 = new FileInfo(@“c:\xx\xx.doc”);
FileStream fs7= myfile4.Create();

FileStream文件流的关闭

当我们使用完了一个流之后,一定要调用fs.Close();方法去关闭流,关闭流会释放与它相关联的资源,允许其他应用程序为同一个文件设置流。这个操作也会刷新缓冲区。

7.从文件流中读取内容和写入内容

从文件流读取内容
1,int nextByte = fs.ReadByte();读取一个字节(0-255)的数据,返回结果,如果达到流的末尾,就返回-1
2,int nBytesRead = fs.Read(ByteArray,0,nBytes);//读取多个字节,第一个是存放的数组,第二个参数是开始存放的索引,第三个参数是要读取多少个字节。返回的结果是读取的自己的实际个数,如果达到流的末尾 返回-1

向文件流写入内容
1,byte NextByte = 100;fs.WriteByte(NextByte);把一个字节写入文件流中
2,fs.Write(ByteArray,0,nBytes); 把一个自己数组写入文件流中 参数同上

8.读写文本文件

我们对文本文件的读写一般使用StreamReader和StreamWriter,因为不同的文本有不同的编码格式,这个StreamReader会帮我们自动处理,所以我们不需要关心文本文件的编码是什么

1,创建文本的读取流(会检查字节码标记确定编码格式)
StreamReader sr = new StreamReader(@“c:\xx\ReadMe.txt”);
2,指定编码格式
StreamReader str = new StreamReader(@“c:\xx\xx.txt”,Encoding.UTF8);
(可取的编码格式 ASCII Unicode UTF7 UTF8 UTF32)
3,在文件流的基础上创建文本读取流
FileStream fs = new FileStream(@“c:\xx\xx.txt”,FileMode.Open,FileAccess.Read,FileShare.None);
StreamReader sr = new StreamReader(fs);
4,通过文件信息创建文本读取流-第二种方式
FileInfo myFile = new FileInfo(@“c:\xx\xx.txt”);
StreamReader sr = myFile.OpenText();
流的关闭 sr.Close();

读取文本文件

1,string nextLine = sr.ReadLine();//读取一行字符串
2,string restOfStream = sr.ReadToEnd();//读取流中所有剩余的文本内容
3,int nextChar = sr.Read();//只读取一个字符
4, int nChars = 100;
char[] charArray = new char[nChars];
int nCharsRead = sr.Read(charArray,0,nChars); 读取多个字符,第一个参数是要存放的字符数组,第二个参数是从数组的哪一个索引开始放,第三个参数是读取多少个字符 返回值是实际读取的字符的个数

文本写入流StreamWriter-创建

StreamWriter的创建
1,StreamWriter sw = new StreamWriter(@“c:\xx\xx.txt”);(默认使用UTF-8编码)

2,StreamWriter sw = new StreamWriter(@“c:\xx\xx.txt”,true,Encoding.ASCII)
第二个参数表示是否以追加的方式打开,第三个参数是编码方式

3,通过FileStream创建StreamWriter
FileStream fs = new FileStream(@“c:\xx\xx.txt”,FileMode.CreateNew,FileAccess.Write,FileShare.Read);
StreamWriter sw = new StreamWriter(fs);
4,通过FileInfo创建StreamWriter
FileInfo myFile = new FileInfo(@“c:\xx\xx.txt”);
StreamWriter sw = myFile.CreateText();
所有流用完之后关闭 sw.Close();

文本写入流StreamWriter-写入

1,写入一行字符
string nextLine = "x xx x x x x ";sw.Write(nextLine);
2,写入一个字符
char nextChar = ‘a’;
sw.Write(nextChar);
3,写入字符数组
char[] charArray = …;
sw.Write(charArray);
4,写入字符数组的一部分
sw.Write(charArray,StartIndex,Length);
1:要写入的数组 2:开始索引 3:写入长度