• 第26章 I/O操作
    • 26.1 文件和目录">26.1 文件和目录
      • 26.1.1 File和Directory">26.1.1 File和Directory

    第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章 I/O操作 - 图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