第26章 I/O操作
本章主要学习I/O相关的知识,所谓I/O就是“输入(Input)/输出(Output)”,例如文件和目录操作、流以及流的操作(包括文件流、网络流等),等等。此外,本章还将学习序列化的相关知识,以及.NET中的独立存储机制。本章还特别介绍了.NET 4对BCL中I/O操作相关类的改进。
相信通过本章的学习,大家可以掌握平时工作中需要的I/O操作技能。
26.1 文件和目录
.NET在System.IO命名空间中提供了操作文件和目录的通用类,如图26-1所示。
图 26-1 文件/目录操作的相关类图
❑文件
■File:提供文件操作的静态方法;
■FileInfo:提供文件操作的实例方法。
❑目录
■Directory:提供目录操作的静态方法;
■DirectoryInfo:提供目录操作的实例方法。
26.1.1 File和Directory
我们先从File和Directory这两个静态类谈起。它们适用于对文件和目录进行单步操作,比使用FileInfo和DirectoryInfo所需的代码更少。当使用File类的静态方法操作文件时,需要提供该文件的路径。另外,每个操作被调用时都会执行安全性检查,以确认用户有相关文件的操作权限。例如,调用File.Exists方法检查传入的文件路径是否存在时,不管文件是否存在,如果调用方不具有读取指定文件所需的足够权限,则不引发异常并且该方法返回false。
用一段示例代码来演示Directory类和File类的用法,首先在C盘根目录创建一个名称为iosample的目录,在建目录前先调用Directory的Exists方法判断目录(C:\iosample)是否存在,如果存在则不建立,不存在则调用CreateDirectory方法创建目录;目录创建就绪后,检查目录内是否有名为"mytext.txt"的文本文件,如果没有则使用File类的Create方法新建文件,否则调用Open方法打开它,返回类型均为FileStream(文件流在稍后介绍),然后将返回值作为参数传入StreamWriter类型实例writer中,通过writer将当前时间作为数据写入文件,如代码清单26-1所示。
代码清单26-1 使用File和Directory类创建目录和文件
using System;
using System.IO;
namespace ProgrammingCSharp4
{
class IOSample
{
public static void Main()
{
FileStream fs=null;
StreamWriter writer=null;
try
{
string dirPath=@"c:\iosample";
string filePath=string.Format(@"{0}{1}",dirPath,"mytext.txt");
if(!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
Console.WriteLine(@“创建一个目录:c:\iosample”);
}
else
{
Console.WriteLine(@“目录:c:\iosample已存在”);
}
if(!File.Exists(filePath))
{
fs=File.Create(filePath);
Console.WriteLine(“新建一个文件:{0}”,filePath);
}
else
{
fs=File.Open(filePath,FileMode.Open);
fs.Seek(0,SeekOrigin.End);
Console.WriteLine(“文件:{0}已存在,打开它”,filePath);
}
writer=new StreamWriter(fs);
string newContent=DateTime.Now.ToString();
writer.WriteLine(newContent);
Console.WriteLine(“向文件中写入数据:{0}”,newContent);
}
catch(Exception e)
{
Console.WriteLine(“错误:{0}”,e.Message);
}
finally
{
writer.Close();
fs.Close();
Console.WriteLine(“关闭数据流……”);
}
}
}
}
上述代码第1次运行的结果为:
创建一个目录:c:\iosample
新建一个文件:c:\iosample\mytext.txt
向文件中写入数据:2010-5-29 22:47:29
关闭数据流……
第2次运行的结果为:
目录:c:\iosample已存在
文件:c:\iosample\mytext.txt已存在,打开它
向文件中写入数据:2010-5-29 22:48:00
关闭数据流……
第2次运行后,文件c:\iosample\mytext.txt的内容为:
2010-5-29 22:47:29
2010-5-29 22:48:00