在System.IO名称空间中包含了用于文件输入输出的主要类。
File:实用类,提供许多静态方法,用于移动、复制和删除文件。
Directory:实用类,提供许多静态方法,用于移动、复制和删除目录。
Path:实用类,用于处理路径名称。
FileInfo:表示磁盘上的物理文件,具有可以处理此文件的方法。要完成对文件的读取和写入工作,就必须创建Stream对象。
DirectoryInfo:表示磁盘上的物理目录,具有可以处理此目录的方法。
FileStream:表示可以被写或被读,或二者均可的文件。此文件可以同步或异步的读和写。
StreamReader:从流中读取字符数据,并可以通过使用FileStream被创建为基类。
StreamWriter:向流写字符数据,可以通过使用FileStream被创建为基类。
FileSystemWatcher:用于监控文件和目录,并在这些位置发生变化时,给出应用程序可以捕获的事件。
File类一些常用的静态方法:
方法 | 说明 |
Copy() | 将文件复制到规定的位置 |
Create() | 在规定的路径上创建文件 |
Delete() | 删除文件 |
Open() | 在规定的路径上返回FileStream对象 |
Move() | 将规定的文件移动到新位置。可以在新位置为文件规定不同的名称 |
Directory类一些常用的静态方法:
方法 | 说明 |
CreateDirectory() | 创建具有规定路径的目录 |
Delete() | 删除规定的目录以及其中的所有文件 |
GetDirectories() | 返回表示当前目录之下的目录的Directory对象的数组 |
GetFiles() | 返回在当前目录中的File对象的数组 |
Move() | 将规定的目录移动到新位置。可以在新位置为文件夹规定一个新名称 |
FileInfo类:
它没有静态方法,仅可用于实例化的对象。FileInfo对象表示在磁盘或网络位置的文件。注意它不是流。为了实现对文件的读取或写入,必须创建Stream对象。
如果仅在对象上进行单一方法调用,则可以使用静态File类。在此,静态调用要快一些,因为.Net Framework不必遍历实例化新对象并调用方法的过程。但是如果应用程序在文件上执行几种操作,在实例化FileInfo对象并使用其方法就更好一些。这会节省时间,因为对象将在文件系统上引用正确的文件,而静态类就必须每次都寻找文件。
FileInfo类提供的基础性的属性,可用来更新文件。
属性 | 说明 |
Attributes | 获取或者设置当前文件的属性 |
CreationTime | 获取当前文件的创建日期和时间 |
DirectoryName | 返回文件目录的路径 |
Exists | 判断是否存在文件 |
FullName | 检索文件的完整路径 |
Length | 获取文件的容量 |
Name | 仅仅返回文件的名称,而不是完整的文件位置路径 |
DirectoryInfo类:
DirectoryInfo类的作用类似于FileInfo类。它是一个实例化的对象,表示计算机上的单一目录。同FileInfo类—样,在Directory和DirectoryInfo之间可以复制许多方法调用。当使用这二者时,可以便用相同的原则:如果进行单一调用,就使用静态Directory类。如果进行一系列调用,则使用实例化的DirectoryInfo对象。
DirectoryInfo类与FileInfo类共享几乎所有相同的属性,DirectoryInfo类作用在无文件的目录上除外。
FileStream对象:
表示在磁盘或网络路径上指向文件的流。当类提供向文件读取和写入字节的方法时,经常使用StreamReader和StreamWriter执行这些功能。这是因为FileStream类操作字节和字节数组,而Stream类操作字符数据。
还有几种方法可以创建FileStream对象。构造函数具有许多不同的重载/版本,但是最简单的构造函数仅仅带有两个参数,即文件名和FileMode枚举。
FileStream aFile = new FileStream("a.txt",FileMode.OpenOrCreate);
FileMode枚举的成员:
FileMode枚举成员 | 说明 |
Append | 如果文件存在,就打开文件,将文件位置移动到文件的末尾,并创建个新文件。FileMode.Append仅可以与枚举FileAccess.Write联合使用 |
Create | 创建新文件,如果存在这样的文件就破坏它 |
CreateNew | 创建新文件,但是如果已经存在了此文件,则抛出异常 |
Open | 打开现有的文件。如果不存在所规定的文件,则抛出异常 |
OpenOrCreate | 如果文件存在,则规定打开文件,否则就创建新文件。如果文件已经存在,则保留在文件中的数据 |
Truncate | 打开现有文件,清除其内容。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。必须存在有文件,否则就会抛出异常 |
前面的构造函数默认以只读模式打开文件。需要一个附加参数规定不同的访问级别,此参数即FileAccess参数。
FileStream aFile = new FileStream("a.txt",FileMode.OpenOrCreate,FileAccess.Write);
此行代码将打开文件,对文件进行写访问。对文件的任何读的企图都会导致抛出异常。仅有3种类型的FileAccess枚举:Read,ReadWirte和Write。可以打开一个文件,只读、只写或进行读写操作。此属性的作用是:基于用户的身份验证级别改变用户对文件的访问。
例:从文件中读取信息(其中用到了将字节块转换为字符块的方法)
例:将相应的字符信息写入到文件中(其中用到了将字符块转换为字节块的方法,然后再进行写入操作)
StreamWriter类:
允许我们将字符和字符串写入到文件中,它处理重要的转换和向FileStream对象写入工作。
如果已经有了FileStream对象,则可以使用此对象来创建StreamWriter类。
FileStream aFile = new FileStream(@"Temp.txt",FileMode.CreateNew);
StreamWriter sw = new StreamWriter(aFile);
也可以直接从文件中创建StreamWriter对象。
StreamWriter sw = new StreamWriter(@"Temp.txt",true);
这个构造函数中的后一个参数的意义是:
false:创建一个新文件,或者截取现有文件并打开它。
true:打开文件,保留原来的数据。如果找不到文件,则创建一个新文件。
例子见程序。
StreamReader类:
从文件中读取数据,可以用于任何流。
利用FileStream对象创建。
FileStream aFile = new FileStream(@"Temp.txt",FileMode.Open);
StreamReader sr = new StreamReader(aFile);
直接从文件中创建。
StreamReader sw = new StreamReader(@"Temp.txt");
例子见程序。
监控文件结构:
这里使用的FileSystemWatcher类,可以对文件系统事件做出响应。
使用这个类前必须设置的属性
属性 | 说明 |
Path | 它设置要被监控的文件或目录位置 |
NotifyFilter | 这是NotifyFilters枚举值的组合,NotifyFilters枚举值规定在被监控的文件内要监控哪些内容。这些表示要被监控的文件或文件夹的属性。如果任何规定的属性发生了变化,则就引发事件。可能的枚举值是:Attributes,CreationTime,DirectoryName,FileName,LastAccess,LastWrite,Security和Size。注意可以通过二进制OR操作符联合使用这些枚举值 |
Filter | 在其上监控文件的过滤器,例如:*.txt |
设置后必须为它4种事件编写事件处理程序:Changed,Created,Deleted和Renamed。
监控文件的例子UseFileAdvanced见下载。
异步访问文件:
在基础中介绍的例子对文件的访问都是同步的。这表示直到完成了读或写操作,才能继续进行应用程序流。对于大多数应用程序都适用同步文件访问。但是有时需要写入大量数据,而又不希望在完成写入工作之前让应用程序处于等待状态(假死)。或者需要从网络的某个位置的文件上读取数据,但是网络连接速度却非常慢;在加载数据期间,应用程序可以继续处理其他工作或取消当前的工作,而不必等待进程结束再处理。
FileStream类给出了几种允许对文件进行异步访问的方法。BeginRead()方法,此方法接受与基本Read方法的参数相类似的参数和其他一些附加参数来启动一个异步进程:
IAsyncResult BeginRead(byte[] array, int offset, int numBytes, AsyncCallback userCallBack, object stateObject);
前3个参数完全等同于Read方法的参数。UserCallBack参数是定制的方法,当读取操作结束时,.NET Framework就会将这种定制方法调用回应用程序中。此方法不是必须的,所以可以给它传递null。最后一个参数是用户提供的状态对象,与回调方法一起使用,以便分隔多个异步操作。因为可以使用一个回调方法负责许多不同的操作,所以可以使用此参数来传递规定异步操作的字符串或数据值。因为还没使用回调方法这里可以使用null。
所返回的IAsyncResult对象是读取进程的抽象表示。它保护许多属性和方法,允许查询进程的状态,以及判断进程是否结束了。
为了完成读取进程,就要调用EndRead()方法,并传入从BeginRead()调用返回的IAsyncResult对象。
例子UseIAsyncResult见下载。