本章重点介绍windows应用程序对文件读写所涉及的System.IO命名空间和FileFileInfoFileStreamBinaryReaderBinaryWriterBufferedStream等类,以及常用的方法、参数、属性、事件、枚举等。
u本章的学习目标:
n了解System.IO 命名空间
n掌握读写文本文件的方法
n掌握向文件读写二进制数据的方法
n掌握读写内存流的方法

3-1  System.IO 命名空间

u本节学习目标:
n了解System.IO类和引用方式
n了解File类的常用方法
n了解Fileinfo类的常用方法和主要属性
n学习实现文件的复制方法
n学习如何获取文件基本信息方法
n了解文件夹类Directory的常用方法
n学习获取文件的基本信息方法
n学习简易文本编辑器的开发
以字节形式向磁盘写数据通常称为字节流(比特流)。存储在磁盘上的字节集合称为文件。在windows应用程序中,经常会读取文件中的数据,也会把处理后的数据存放到文件中,这就需要对外存上的文件进行输入/输出(I/O)处理。例如:一名财务人员将单位的工资报表进行保存,应用程序就会将数据以.xls文件形式保存到硬盘上。而另一位在家休假的员工想浏览旅游期间拍摄的照片,应用程序就会读取存放在硬盘上的.bmp文件。第三位员工要保留与好友的聊天记录,应用程序就会将会话文本以.txt文件形式保存到硬盘上。如图31所示:
3-1  文件应用举例

3-1-1 System.IO类介绍

基于.NET2.0环境下的软件系统开发,已经把对文件的读写操作从底层转移到对类库的使用。类库结构中有个System.IO命名空间,里面包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。列举一些常用的类,如表31所示:
3-1 System.IO 命名空间常用的类
说明
提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。
FileStream
公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。
BinaryReader
用特定的编码将基元数据类型读作二进制值。
BinaryWriter
以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
BufferedStream
给另一流上的读写操作添加一个缓冲层。无法继承此类。
Directory
公开用于创建、移动和枚举通过目录和子目录的静态方法。无法继承此类。
DirectoryInfo
公开用于创建、移动和枚举目录和子目录的实例方法。无法继承此类。
Path
对包含文件或目录路径信息的 String 实例执行操作。这些操作是以跨平台的方式执行的。
StreamReader
实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。
StreamWriter
实现一个 TextWriter,使其以一种特定的编码向流中写入字符。
FileSysWatcher
侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
这些类的结构如图32所示:
3-2  System.IO 命名空间的类结构图
还有几个常作为参数的枚举,如表32所示:
3-2  System.IO 命名空间常用的枚举
枚举
说明
FileMode
指定操作系统打开文件的方式。
FileShare
包含用于控制其他 FileStream 对象对同一文件可以具有的访问类型的常数。
FileAccess
定义用于控制对文件的读访问、写访问或读/写访问的常数。
小知识:
System.IO命名空间的引用
在第一章提到了Using语句的使用,这里仍然建议使用Using来引用System.IO命名空间。在代码页的头部引用了System.IO命名空间
using System.IO;
在代码中就可以随意使用其所包含的类及枚举了,例如:File.Creat()。否则,需要在代码处加上System.IO前缀,例如:System.IO. File.Creat()。
  通过MSDN查看System.IO命名空间
请打开MSDN,选中索引标签,在查找文本框内填入“System.IO”,在列表框中选中“System.IO命名空间”,右侧主页面会显示类、枚举、委托、结构列表。点击类“File”,就会看到关于类“File”的介绍,还包括语法、备注、示例、继承层次结构、线程安全、平台、版本信息、公共方法、参见。通过这些帮助文档,尤其是示例,很容易掌握类“File”的使用。

3-1-2  File类的常用方法

利用MSDN就可以掌握类File的使用,类File提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。类File有几个常用方法,如表33所示:
3-3 File的常用方法
方法
说明
Move
将指定文件移到新位置,并提供指定新文件名的选项。
Delete
删除指定的文件。如果指定的文件不存在,则不引发异常。
Copy
已重载。 将现有文件复制到新文件。
CreateText
创建或打开一个文件用于写入 UTF-8 编码的文本。
OpenText
打开现有 UTF-8 编码文本文件以进行读取。
Open
已重载。 打开指定路径上的 FileStream

1 案例学习:了解File类的一些主要方法

下面的示例演示了File类的一些主要方法。
using System;
using System.IO;
class Test
{
    public static void Main()
    {
        string path = @"c:\temp\MyTest.txt";
        if (!File.Exists(path))
        {
            // 创建文件以便写入内容。
            using (StreamWriter sw = File.CreateText(path))
            {
                sw.WriteLine("Hello");
                sw.WriteLine("And");
                sw.WriteLine("Welcome");
            }
        }
        // 打开文件从里面读数据。
        using (StreamReader sr = File.OpenText(path))
        {
            string s = "";
            while ((s = sr.ReadLine()) != null)
            {
                Console.WriteLine(s);
            }
        }
        try
        {
            string path2 = path + "temp";
            // 确认将要拷贝成的文件是否已经有同名的文件存在。
            File.Delete(path2);
            // 拷贝文件。
            File.Copy(path, path2);
            Console.WriteLine("{0} was copied to {1}.", path, path2);
            // 删除新生成的文件。
            File.Delete(path2);
            Console.WriteLine("{0} was successfully deleted.", path2);
        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
    }
}

3-1-3  Fileinfo类的常用方法

FileInfo提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。类FileInfo有几个常用方法,如表34所示:
3-4 FileInfo的常用属性
属性
说明
Attributes        
获取或设置当前 FileSystemInfo FileAttributes。(从 FileSystemInfo 继承。)
获取或设置当前 FileSystemInfo 对象的创建时间。(从 FileSystemInfo 继承。)
获取父目录的实例。
获取表示目录的完整路径的字符串。
已重写。获取指示文件是否存在的值。
获取表示文件扩展名部分的字符串。(从 FileSystemInfo 继承。)