一.流
在.NET Framework 中进行的所有输入和输出工作都要用到流(stream)。流是序列化设备(serialdevice)的抽象表示。序列化设备可以以线性方式存储数据,并可以按同样的方式访问:一次访问一个字节。
有两种类型的流:
输出流:当向某些外部目标写入数据时,就要用到输出流。这可以是物理磁盘文件、网络位置、打印机或另一个程序。理解流编程技术可以带来许多高级应用。本章仅讨论文件系统数据,所以只介绍写入磁盘文件。
输入流:用于将数据读入程序可以访问的内存或变量中。到目前为止,我们使用的最常见的输入流形式是键盘。输入流可以来自任何源,在此主要关注读取磁盘文件。适用于读/写磁盘文件的概念也适用于大多数设备,因此通过本章的学习,我们就会对流有基本的认识,并学习可以应用于许多情况的有效方法。
二.用于输入和输出的类
类 说 明
File 静态实用类,提供许多静态方法,用于移动、复制和删除文件
Directory 静态实用类,提供许多静态方法,用于移动、复制和删除文件
Path 实用类,用于处理路径名称
FileInfo 表示磁盘上的物理文件,该类包含处理此文件的方法。要完成对文件的读写工作,就必须创建Stream 对象
DirectoryInfo 表示磁盘上的物理目录,该类包含处理此目录的方法
FileSystemInfo 用作FileInfo 和DirectoryInfo 的基类,可以使用多态性同时处理文件和目录
FileStream 表示可写或可读,或二者均可的文件。此文件可以同步或异步地读写
StreamReader 从流中读取字符数据,可以使用FileStream 将其创建为基类
StreamWriter 向流写入字符数据,可以使用FileStream 将其创建为基类
FileSystemWatcher FileSystemWatcher 是本章要介绍的最复杂的类。它用于监控文件和目录,提供了这些文件和目录发生变化时应用程序可以捕获的事件,在Windows 编程技术中缺乏此功能,但是现在.NET很容易对文件系统事件作出响应
三.File类和Directory类
File 类的一些最常用的静态方法如表所示。
方 法 说 明
Copy() 将文件从源位置复制到目标位置
Create() 在指定的路径上创建文件
Delete() 删除文件
Open() 返回指定路径上的FileStream 对象
Move() 将指定的文件移动到新位置。可以在新位置为文件指定不同的名称
Directory 类的一些常用的静态方法如表所示。
方 法 说 明
CreateDirectory() 创建具有指定路径的目录
Delete() 删除指定的目录及其中的所有文件
GetDirectories() 返回表示指定目录下的目录名的string 对象数组
EnumerateDirectories() 与GetDirectories()类似,但返回IEnumerable<string>集合
GetFiles() 返回在指定目录中的文件名的string 对象数组
EnumerateFiles() 与GetFiles()类似,但返回文件名的IEnumerable<string>集合
GetFileSystemEntries() 返回在指定目录中的文件和目录名的string 对象数组
EnumerateFileSystemEntries() 与GetFileSystemEntries()类似,但返回文件和目录名的IEnumerable<string>集合
Move() 将指定的目录移到新位置。可以在新位置为文件夹指定一个新名称
四,FileInfo类
FileInfo 类不像File 类,它不是静态的,没有静态方法,仅可用于实例化的对象。FileInfo 对象表示磁盘或网络位置上的文件。提供文件路径,就可以创建一个FileInfo 对象:
FileInfo aFile = new FileInfo(@"C:\Log.txt");
五.路径名和相对路径
相对路径名相对于一个起始位置。使用相对路径名时,无需规定驱动器或已知的位置;前面的当前工作目录就是起点, 这是相对路程名的默认设置。例如, 如果应用程序运行在C:\Development\FileDemo 目录上, 并使用相对路径LogFile.txt , 该文件就是C:\Development\FileDemo\LogFile.txt。为了上移目录,要使用..字符串。这样,在同一个应用程序中,路径..\Log.txt 表示C:\Development\Log.txt 文件。
只要需要,就可以使用Directory.GetCurrentDirectory()找出工作目录的当前设置,也可以使用Directory.SetCurrentDirectory()设置新路径。
六.FileStream对象
FileStream 对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方
法,但经常使用StreamReader 或StreamWriter 执行这些功能。
FileStream aFile = new FileStream(filename, FileMode.<Member>, FileAccess.<Member>);
(1)FileMode
成 员 文 件 存 在 文件不存在
Append 打开文件, 流指向文件的末尾。 创建一个新文件。只能与枚举FileAccess.Write 结合使用
只能与枚举FileAccess.Write 结合使用
Create 删除该文件,然后创建新文件 创建新文件
CreateNew 抛出异常 创建新文件
Open 打开现有的文件,流指向文件开头 抛出异常
OpenOrCreate 打开文件,流指向文件开头 创建新文件
Truncate 打开现有文件,清除其内容,流指向文件开头, 抛出异常
保留文件的初始创建日期
(2)FileAccess
成 员 说 明
Read 打开文件,用于只读
Write 打开文件,用于只写
ReadWrite 打开文件,用于读写
获取文件位置: aFile.Seek(113, SeekOrigin.Begin);
读取数据: aFile.Read(byData, 0, 200);
byte[] byData;
char[] charData;
FileStream aFile = new FileStream("Temp.txt", FileMode.Create); ///新建文件流
charData = "My pink half of the drainpipe.".ToCharArray(); 将string转换成字符数组
byData = new byte[charData.Length]; 获取字符数组的字节数
Encoder e = Encoding.UTF8.GetEncoder(); 基于UTF-8 编码方法来创建Encoder 对象
e.GetBytes(charData, 0, charData.Length, byData, 0, true);
// 移动指针到最开始的位置
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byData, 0, byData.Length);写入数据
七.StreamWriter对象与StreamReader对象
如果已经有了FileStream 对象,就可以使用此对象来创建StreamWriter 对象:
FileStream aFile = new FileStream("Log.txt", FileMode.CreateNew);
StreamWriter sw = new StreamWriter(aFile);
也可以直接从文件中创建StreamWriter 对象:
StreamWriter sw = new StreamWriter("Log.txt", true);
这个构造函数的参数是文件名和一个Boolean 值,这个Boolean 值规定是追加文件,还是创建新文件:
如果此值设置为false,则创建一个新文件,或者截取现有文件并打开它。
如果此值设置为 true,则打开文件,保留原来的数据。如果找不到文件,则创建一个新文件。
///写入数据到文件中
{
FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(aFile);
bool truth = true;
// 写入数据到文件中
sw.WriteLine("Hello to you.");
sw.WriteLine("It is now {0} and things are looking good.",
DateTime.Now.ToLongDateString());
sw.Write("More than that,");
sw.Write(" it’s {0} that C# is fun.", truth);
sw.Close();
}
//读取文件数据
{
FileStream aFile = new FileStream("Log.txt", FileMode.Open);
StreamReader sr = new StreamReader(aFile);
line = sr.ReadLine();
// 按行读取出数据
while (line != null)
{
Console.WriteLine(line);
line = sr.ReadLine();
}
sr.Close();
}