文件系统数据
流
流是串行化设备的抽象表示
两种类型的流:
输出流:当向某些外部目标写入数据时,就要用到输出流
输入流:用于将数据读到程序可以访问的内存或变量中
用于输入和输出的类
System.IO包含用于在文件中读写数据的类
File和Directory类
File和Directory实用类提供了许多静态方法用于处理文件和目录
这些方法可以移动文件、查询和更性属性,创建FileStream对象
File类常用静态方法:
方法 说明
Copy() 将问文件从源位置复制到目标位置
Create() 在规定的路径上创建文件
Delete() 删除文件
Open() 在规定路径上返回FileStream对象
Move() 将规定的文件移动到新位置,可以自定义文件名
Directory类常用静态方法:
方法 说明
CreateDirectory() 创建具有规定路径的目录
Delete() 删除规定的目录以及其中的所有文件
GetDirectories() 返回表示当前目录下的目录名的string对象数组
GetFiles() 返回在当前目录中的文件名的string对象数组
GetFileSystemEntries() 返回在当前目录中的文件和目录名的string对象数组
Move() 将规定的目录移动到新位置,可以自定义文件夹名
FileInfo类
FileInfo类用于实例化的对象
FileInfo对象表示磁盘或网络位置上的文件
提供文件路径,就可以创建一个FileInfo对象
例如:
FileInfo aFile = new FileInfo(@"C:\Log.txt");
注意:
前缀@表示这个字符串应逐个字符地解释,如果没有@前缀就需要使用“\\”代替“\”
FileInfo类许多方法类似File类的方法
例如:
FileInfo aFile = new FileInfo("Data.txt");
if (aFile.Exists)
{
....
}
等同于File类的
if (File.Exists("Data.txt"))
{
....
}
适用范围:
如果只进行单一方法调用,使用静态File类上的方法会比较快
如果应用程序在文件上执行多个操作,使用FileInfo类就不需要每次都寻找文件
FileInfo类也提供与底层文件相关的属性
属性 说明
Attributes 使用FileAttributes枚举,获取或设置当前文件或目录的属性
CreationTime 获取当前文件创建日期和时间
Extension 提取文件的扩展名
Exists 判断文件是否存在
FullName 检索文件的完整路径
LastAccessTime 获取或设置上次访问当前文件的日期和时间
LastWriteTime 获取或设置上次写入当前文件的日期和时间
Name 获取文件名
FileInfo专用属性
属性 说明
Property 检索一个DirectoryInfo对象,表示包含当前文件的目录
DirectoryName 返回文件目录的路径
IsReadOnly 文件只读属性的快捷方式
Length 获取文件的容量
FileInfo对象本身不表示流,要读写文件必须创建Stream对象
DirectoryInfo类
DirectoryInfo类是一个实例化的对象,表示计算机上的单一目录
Directory和DirectoryInfo之间可以复制许多方法调用
如果进行单一调用,使用较快的静态Directory类
如果进行多个调用,使用实例化的DirectoryInfo对象
DirectoryInfo专用属性
属性 说明
Parent 表示包含当前目录的目录
Root 表示包含当前目录的根目录
FileStream对象
FileStream对象表示在磁盘或网络路径上指向文件的流
有多个方法可以创建FileStream对象
例如:
FileStream aFile = new FileStream(filename, FileMode.Member);
参数是文件名和FileMode枚举类
FileMode枚举有几个成员规定如何打开或创建文件
另一个常用的构造函数:
FileStream aFile = new FileStream(filename, FileMode.Member, FileAccess.Member);
其中第三个参数是FileAccess枚举的一个成员,规定了流的作用
FileAccess枚举成员:
成员 说明
Read 打开文件,用于只读
Write 打开文件,用于只写
ReadWrite 打开文件,用于读写(默认)
FileMode枚举成员:
成员 文件存在 文件不存在
Append 打开文件,流指向文件末尾 创建一个新文件
Create 删除该文件,然后创建新文件 创建新文件
CreateNew 抛出异常 创建新文件
Open 打开文件,流指向文件开头 抛出异常
OpenOrCreate 打开文件,流指向文件开头 创建新文件
Truncate 打开文件,清除内容,指向开头 抛出异常
File和FileInfo类都提供更容易的OpenRead()和OpenWrite()方法创建FileStream
前者打开了只读访问的文件,后者只允许写入文件
例如:
FileStream aFile = File.OpenRead("Data.txt");
同样地:
FileInfo aFileInfo = new FileInfo("Data.txt");
FileStream aFile = aFileInfo.OpenRead();
文件位置
FileStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置
使用Seek()方法可以定位到指定位置
它有两个参数:
第一个参数规定文件指针以字节为单位的移动距离
第二个参数规定开始计算的起始位置,用SeekOrigin枚举的一个值表示
SeekOrigin枚举包含:Begin、Current和End
例如:
aFile.Seek(8, SeekOrigin.Begin);
将文件指针移动到文件的第8个字节,从文件的第一个字节开始
aFile.Seek(2, SeekOrigin.Current);
将指针从当前位置开始移动2个字节
读写文件时,文件指针也会改变
例如读了10个字节后,文件指针将指向第11个字节
可以规定负查找位置
例如:
aFile.Seek(-5, SeekOrigin.End);
查找文件中倒数第5个字节
读取数据
FileStream.Read()方法可以从FileStream对象所指向的文件中访问数据
这个方法从流中读取字节块并将该数据写入给定缓冲区中
它包含三个参数:
第一个参数是传输进来的字节数组,用以接受FileStream对象中的数据
第二个参数是字节数组中开始写入数据的位置
最后一个参数是最多读取的字节数
返回值是读入 buffer 中的总字节数
写入数据
使用FileStream.Write()方法向文件写入数据
这个方法使用从缓冲区读取的数据将字节块写入该流
它包含三个参数:
第一个参数包含要写入该流的数据的缓冲区
第二个参数是字节数组中开始复制数据的位置
最后一个参数是要写入当前流的最大字节数
StreamWriter对象
StreamWriter类允许将字符和字符串写入到文件中
创建StreamWriter对象:
FileStream aFile = new FileStream("Log.txt", FileMode.CreateNew);
StreamWriter sw = new StreamWriter(aFile);
或者直接从文件中创建StreamWriter对象:
StreamWriter sw = new StreamWriter("Log.txt", true);
其中第二个参数是一个bool值,规定是添加到文件的末尾还是创建新文件:
如果为flase,则创建一个新文件,或者截取现有文件并打开它
如果为true,则打开文件保留原来数据,如果找不到文件则创建一个新文件
StreamReader对象
StreamReader类用来从文件中读取数据,可以用于任何流
创建StreamReader对象:
FileStream aFile = new FileStream("Log.txt", FileMode.Open);
StreamReader sr = new StreamReader(aFile);
或者直接从文件中创建StreamReader对象:
StreamReader sr = new StreamReader("Log.txt");
读取数据
StreamReader的Read()和ReadLine()方法用于读取数据
例如:
StreamReader sr = new StreamReader(aFile);
int nChar;
nChar = sr.Read();
while(nChar != -1)
{
Console.Write(Convert.ToChar(nChar));
nChar = sr.Read();
}
sr.Close();
对于小型文件可以使用ReadToEnd()方法,用于读取整个文件
例如:
StreamReader sr = new StreamReader(aFile);
strLine = sr.ReadToEnd();
Console.WriteLine(strLine);
sr.Close();
用分隔符分隔的文件
有些文件会使用分隔符分隔文件的形式存储
使用String类的Split()方法可以用于将字符串转换为基于所提供的分隔符的数组
读写压缩文件
使用System.IO.Compression命名空间有两个压缩类DeflateStream和GZipStream
只需在顶部指定流是用于压缩还是解压缩,就可以进行相应的操作
串行化对象
System.Runtime.Serialization和System.Runtime.Serialization.Formatters命名空间提供了串行化对象的基础架构
有两个可用的实现方式:
System.Runtime.Serialization.Formatters.Binary
包含BinaryFormatter类,能把对象和二进制数据相互串行化
System.Runtime.Serialization.Formatters.Soap
包含SoapFormatter类,能把对象和SOAP格式的XML数据相互串行化
这两个类都实现了IFormatter接口,该接口的方法:
方法 说明
void Serialize(Stream stream, object source) 把source串行化为stream
object Deserialize(Stream stream) 串行化stream中的数据,返回得到的对象
例如:
使用BinaryFormatter进行串行化:
IFormatter serializer = new BinaryFormatter();
serializer.Serialize(myStream, myObject);
IFormatter serializer = new BinaryFormatter();
MyObjectType myNewObject = serializer.Deserialize(myStream) as MyObjectType;
监控文件结构
使用FileSystemWatcher类用于监控文件结构
FileSystemWatcher类提供了几个应用程序可以捕获事件,例如修改文件或目录
启用FileSystemWatcher对象之前必须设置的属性:
属性 说明
Path 设置要监控的文件位置或目录
NotifyFilter NotifyFilters枚举值规定要监控的内容
Filter 监控文件的过滤器,例如:*.txt
接着必须为4个事件Changed,Created,Deleted和Renamed编写处理程序
然后将EnableRaisingEvents属性设置为true就开始监控工作