关闭

黑马程序员_文件处理和IO流、目录

291人阅读 评论(0) 收藏 举报
分类:

------- Windows Phone 7手机开发.Net培训、期待与您交流! ------ 

文件处理I/O流、目录

C#程序通过数据流来执行I/O操作。常见的I/O操作有I/O流、目录和文件处理。I/O流提供一种向存储媒介读取字节的方式。文件是由一些具有永久存储性及特定顺序的字节组成的一个有序的、具有名称的集合。而目录就是系统用来管理文件的一种措施,将文件分为不同的类别来存储,增加系统的指向性。

I/O流

流是一种对产生或使用信息的抽象,.NET Framework使用流来支持读取和写入文件。与流相关的操作有三个:读取流、写入流和查找流。与流相关的、最为常用的类包括Stream类、FileStream类(文件流,常用于操作文件)、MemoryStream类(内存流,常用来操作内存中的数据)和BufferedStream类(缓存流,用来操作缓存中的数据)。它们之间的类关系图如下图。

Stream类为抽象类,FileStream类、MemoryStream类和BufferedStream类都直接继承于Stream类。本节将重点介绍FileStream类和MemoryStream类的使用方法。

文件流

文件流是字节序列的抽象概念,序列化用于将对象的状态存储到文件中。C#提供的FileStream类来实现这个功能。使用FileStream类可以产生文件流,以便对文件进行读取、写入、打开和关闭操作。为了方便用户使用类FileStream,微软将一些常用的属性封装到该类中。这些属性可以获取文件流的特性。FileStream类包括9个属性,如流的长度(以字节为单位)、流的当前位置、是否能够读或写或查询等。

属性               说明                                          属性                      说明
CanRead       指示当前流是否支持读取        IsAsync               表示当前流是异步还是同步打开的
CanWrite       指示当前流是否支持写入        CanSeek              指示当前流是否支持查找
Length           获取流的长度                           CanTimeout        表示当前流是否可以超时
Name             获取FileStream的名称            ReadTimeout      指定流在超时前尝试读取多长时间
Position         获取或设置此流的当前位置    

先在E盘下新建一个文件夹C#,在C#里新建一个文本文件1.txt。在1.txt中写入0123456789。以下示例默认都用这个目录下的文本文件。

下面程序获取F实例的长度。创建一个FileStream类的实例F。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {

            // 1.txt中写入0123456789
            FileStream F = File.OpenRead(@"E:\1.txt");      //创建FileStream实例
            long Length = F.Length;
            Console.WriteLine(@"E:\1.txt文件的长度为:" + Length);
            Console.ReadKey();
        }
    }
}

下面设置F实例的当前位置。其中,F是FileStream类的实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream F = File.OpenRead(@"E:\1.txt");   //创建FileStream的实例
            Console.WriteLine("实例的位置:" + F.Position);
            F.Position = 5;             //设置了实例F的位置
            Console.WriteLine("设置了实例F的位置(Position):" + F.Position);
            Console.ReadKey();
        }
    }
}

为了方便用户使用类FileStream,微软还将一些常用的方法封装到该类中。调用这些方法可以打开、关闭、读取和写入文件。FileStream类包括11个方法,如读取文件的Read()方法、写入文件的Write()方法等。

FileStream类的方法的具体说明如下。

方法                         说明
BeginRead()           开始异步读
BeginWrite()           开始异步写
EndRead()              等待挂起的异步读取完成
Lock()                     允许读取访问的同时防止其他进程更改 FileStream
Read()                     从流中读取字节块并将该数据写入给定缓冲区中
ReadByte()             从文件中读取一个字节,并将读取位置提升一个字节
Seek()                     设置当前流的当前位置
SetLength()            设置当前流的长度
Unlock()                  允许其他进程访问以前锁定的某个文件的全部或部分
Write()                     使用从缓冲区读取的数据将字节块写入该流
WriteByte()             将一个字节写入文件流的当前位置

下面使用ReadByte()方法读取F实例中的一个字节的内容。其中,F是FileStream类的实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream F = File.OpenRead(@"E:\1.txt");   //读取文件
            int Result = F.ReadByte();   //读取一个字节的 ASCII 的值
            Console.WriteLine("0的ascii码是:" + Result);
            Console.ReadKey();
        }
    }
}


Seek()方法可以设置流的当前位置,它的语法如下:

public override long Seek(long offet,SeekOrigin origin)

offet参数为偏移量,origin参数的类型为SeekOrigin枚举类型。

orgin参数的值可以为Begin(表示流的开头位置)、Current(表示流的当前位置)或End(表示流的结尾位置)。

origin参数作为起始点,offet参数在origin参数的值之上进行计算。以下两种设置流的当前位置的方法是最为典型的方法。

如果origin参数的值为SeekOrigin.Begin,offet参数的值为0,调用Seek()方法之后,流的当前位置为流的开头位置。

如果origin参数的值为SeekOrigin.End,offet参数的值为0,调用Seek()方法之后,流的当前位置为流的结尾位置。

下面首先使用ReadByte()方法读取F实例中的一个字节的内容,然后调用Seek()方法将流的当前位置设置为流的开头位置。其中,F是FileStream类的实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream F = File.OpenRead(@"E:\1.txt");  //打开文件
            int Result = F.ReadByte();    //读取文件的一个字节
            Console.WriteLine("读取的ASCII值:" + Result);
            long Pos = F.Position;
            Console.WriteLine("Pos = " + Pos);
            F.Seek(0, SeekOrigin.Begin);         //设置流的当前 开始位置为0
            Console.WriteLine("设置后流的当前位置:" + F.Position);
            Console.ReadKey();
        }
    }
}

  

BeginRead()、BeginWrite()、EndRead()、Lock()和Unlock()方法一般用于以异步方式读取或写入流的内容。

内存流

内存流以内存作为支持存储区,可降低应用程序中对临时缓冲区和临时文件的需要。MemoryStream类继承自Stream类,该类的对象的数据来自内存缓冲区。

下面创建MemoryStream类的实例m,它的容量被设置为0。此时,m流表示空流。

MemoryStream m = new MemoryStream();         //创建内存流的实例

下面创建MemoryStream类的实例m,它的容量被设置为100。

MemoryStream m = new MemoryStream(100);    //创建内存流的实例,容量为100

为了方便用户使用类MemoryStream,微软将一些常用的属性封装到该类中。这些属性可以获取内存流的特性。MemoryStream类包括7个属性,如流的长度(以字节为单位)、流的当前位置、是否能够读或写或查询等。MemoryStream类的属性的具体说明如下所示。

属性              说明                                          属性                    说明
CanRead      指示当前流是否支持读取       CanSeek             指示当前流是否支持查找
Capacity       获取或设置流的容量              CanWrite             指示当前流是否支持写入
Length          获取流的长度                         CanTimeout        表示当前流是否可以超时
Position        获取或设置此流的当前位置    

下面创建MemoryStream类的实例m(它的容量为100),并获取该流的长度,保存为length变量。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryStream m = new MemoryStream(100);     //创建一个内存流的实例
            long length = m.Length;
            Console.WriteLine(length);
            Console.ReadKey();
        }
    }

下面创建MemoryStream类的实例m(它的容量为100),并设置该流的当前位置为50。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryStream m = new MemoryStream(100);  //创建内存流的实例
            Console.WriteLine("内存流的当前位置:" + m.Position);
            m.Position = 50;          //设置流的位置
            Console.WriteLine("设置后流的位置:" + m.Position);
            Console.ReadKey();
        }
    }
}

为了方便用户使用类MemoryStream,微软还将一些常用的方法封装到该类中。调用这些方法可以读取和写入流。MemoryStream类包括11个方法,如读取流中内容Read()方法、向流中写入内容Write()方法等。MemoryStream类的方法的具体说明如下。

方法                     说明
GetBuffer()         获取当前流的无符号字节数组
Read()                 从当前流中读取字节块并将数据写入buffer中
ReadByte()         从当前读取一个字节
Seek()                 设置当前流的当前位置
SetLength()        设置当前流的长度
ToArray()            将当前流的内容写入字节数组
Write()                 使用从缓冲区读取的数据将字节块写入当前流
WriteByte()         将一个字节写入当前流中的当前位置
WriteTo()             将当前流的内容写入另一个流中

下面创建MemoryStream类的实例m(它的容量为100),并使用ReadByte()方法读取m实例中的一个字节的内容。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryStream m = new MemoryStream(100);  //创建实例
            int result = m.ReadByte();  //读取一个字节
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}

 

Seek()方法可以设置流的当前位置,它的原型如下。

public override long Seek(long offet,SeekOrigin loc)

offet参数为偏移量,loc参数的类型为SeekOrigin枚举类型。loc参数的值可以为Begin(表示流的开头位置)、Current(表示流的当前位置)或End(表示流的结尾位置)。loc参数作为起始点,offet参数在loc参数的值之上进行计算。以下两种设置流的当前位置的方法是最为典型的方法。

如果loc参数的值为SeekOrigin.Begin,offet参数的值为0,调用Seek()方法之后,流的当前位置为流的开头位置。

如果loc参数的值为SeekOrigin.End,offet参数的值为0,调用Seek()方法之后,流的当前位置为流的结尾位置。

下面创建MemoryStream类的实例m(它的容量为100),并使用ReadByte()方法读取m实例中的一个字节的内容。最后,调用Seek()方法将流的当前位置设置为流的开头位置。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryStream m = new MemoryStream(100);
            int result = m.ReadByte();   //读取一个字节
            Console.WriteLine(m.Position);
            m.Seek(3, SeekOrigin.Begin);  //设置流的位置
            Console.WriteLine(m.Position);
            Console.ReadKey();
        }
    }
}

操作文件

任何一种编程技术,都少不了对文件的操作。.NET提供了一些专门用于文件操作的类,主要包括File和FileInfo类。

File类

File类是一个静态类,它提供了文件操作的方法,并协助创建FileStream对象。微软为了方便用户使用类File,将一些常用的方法封装到该类中。在File类中,该类包含多个静态方法,用来创建、复制、删除、移动和打开文件。其中,常用的静态方法具体说明如下表所示。

方法                                  说明
AppendAllText()             将指定的字符串追加到文件中,如果文件还不存在则创建该文件
AppendText()                  将文本追加到现有文件
Copy()                              将指定文件复制到新文件
Create()                            在指定路径中创建文件
CreateText()                    创建或打开一个文件文本,并写入文本
Delete()                            删除指定的文件
Exists()                             判断指定的文件是否存在
Move()                              将指定文件移到新位置
Open()                              打开指定路径上的文件
OpenRead()                     打开文件以进行读取
OpenText()                      打开文本文件以进行读取
OpenWrite()                     打开文件以进行写入
ReadAllBytes()                打开一个文件,并将文件的内容读入一个字符串,然后关闭该文件
ReadAllLines()                 打开一个文本文件,并将文件的所有行都读入一个字符串数组,然后关闭该文件
ReadAllText()                   打开一个文本文件,并将文件的所有行读入一个字符串,然后关闭该文件
Replace()                          使用其他文件的内容替换指定文件的内容
WriteAllBytes()                创建一个新文件,并在文件中写入指定的字节数组,然后关闭该文件
WriteAllLines()                 创建一个新文件,并在文件中写入指定的字符串,然后关闭文件
WriteAllText()                  创建一个新文件,并在文件中写入内容,然后关闭文件

其中,Create()、Delete()、Move()、Copy()和Replace()方法依次可以用来创建、删除、移动、复制和替换文件。

FileInfo类

FileInfo类是一个密封类,它提供文件操作的实例方法。File类和FileInfo类的区别是前者不能实例化,只提供静态方法,而后者可以实例化,提供的方法与File类类似。微软为了方便用户使用类FileInfo,将一些常用的属性封装到该类中。FileInfo类包括6个属性,可以用来获取文件的名称、完整路径等,具体说明如下表所示。

FileInfo和DirectoryInfo类一样,也包括了FileSystemInfo类继承而来的属性。

属性                        说明                                                     属性            说明
Directory               获取父目录                                          Exists        指定当前文件是否存在
DirectoryName     获取文件的完整路径                          Length        获取当前文件的大小(字节)
IsReadOnly           获取或设置当前文件是否为只读       Name          获取文件的名称

为了方便用户使用类FileInfo,微软还将一些常用的方法封装到该类中。调用这些方法可以对文件进行操作。FileInfo类还包括实例方法,具体说明如下所示。

方法              说明                                                                        方法                           说明
Create()        创建文件                                                                OpenRead()              以只读方式打开文件
Delete()        删除指定文件                                                        OpenWrite()              以只写方式打开文件
MoveTo()      将指定文件移到新位置                                        CreateText()              创建写入新文本文件的StreamWriter
CopyTo()      将现有文件复制到新文件                                     OpenText()                打开指定文本文件,并准备从其文件中读取内容
Replace()     使用其他文件的内容替换指定文件的内容           AppendText()           创建一个StreamWriter,它可以想文本文件追加内容
Open()          打开文件    

其中,Create()、Delete()、MoveTo()、CopyTo()和Replace()方法用来操作文件,它们依次可以用来创建、删除、移动、复制和替换文件。

创建文件

创建文件是指新建一个新的文件。File类提供的Create()方法和FileInfo类提供的Create()方法可以实现该功能。

下面使用FileInfo类的Create()方法创建一个名称为“my.txt”的文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo file = new FileInfo("my.txt");
            file.Create();  //创建文件
            Console.ReadKey();
        }
    }
}

 

该示例首先创建FileInfo类的实例file,它被指定为my.txt文件,然后调用Create()方法创建该文件。新创建的my.txt文件保存在应用程序所在的目录。

写入文件

写入文件是将指定内容写入到文件中。File类提供的OpenWrite()方法和FileInfo类提供的OpenWrite()方法可以实现该功能。

下面使用FileInfo类的OpenWrite()方法将“这是一个配置文件。”字符串写入到名称为my.txt的文件中,具体步骤如下:

(1)创建FileInfo类的实例file,它被指定为my.txt文件。

(2)使用OpenWrite()方法打开my.txt文件,并保存为FileStream类的实例f。

(3)设置被写入的内容(“这是一个配置文件。”字符串),并转换为byte数组,保存为arr。

(4)调用f实例的Write()方法将arr数组中的内容写入到my.txt文件。

(5)调用f实例的Close()方法关闭f实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo file = new FileInfo("my.txt");
            FileStream f = file.OpenWrite();       //创建只写文件
            string value = "这是一个配置文件";
            byte[] arr = System.Text.Encoding.Unicode.GetBytes(value);
            f.Write(arr, 0, arr.Length);         //写入文件
            f.Close();                //关闭文件
            Console.ReadKey();
        }
    }
}


上述示例代码运行之后,将“这是一个配置文件。”字符串写入到名称为my.txt的文件中。可以以记事本的方式查看my.txt文件的内容。

my.txt文件的内容已经被使用Unicode方式编码过,所以不能看到该文件的真实内容。

读取文件

读取文件是指将文件中的内容读取出来。File类提供的OpenRead()方法和FileInfo类提供的OpenRead()方法可以实现该功能。

下面使用FileInfo类的OpenRead()方法从my.txt文件读取内容,并转换为一个字符串(保存为str),最终,将str的内容显示在控制台。具体步骤如下:

(1)创建FileInfo类的实例file,它被指定为my.txt文件。

(2)使用OpenRead()方法打开my.txt文件,并保存为FileStream类的实例f。

(3)创建arr数组,用来保存从my.txt文件读取的内容。

(4)调用f实例的Read()方法读取my.txt文件的内容,并保存到arr数组。

(5)将arr数组转换为一个字符串,并保存为str。

(6)显示str的值。

(7)调用f实例的Close()方法关闭f实例。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo file = new FileInfo("my.txt"); //创建FileInfo类的实例file,它被指定为my.txt文件
            FileStream f = file.OpenRead();  //使用OpenRead()方法打开my.txt文件,并保存为FileStream类的实例f。
            byte[] arr = new byte[f.Length];
            f.Read(arr, 0, (int)f.Length);
            string str = System.Text.Encoding.Unicode.GetString(arr);
            Console.WriteLine(str);
            f.Close();
            Console.ReadKey();
        }
    }

上述示例代码运行之后,将显示“这是一个配置文件。”字符串。

移动文件

移动文件是指将指定的文件移动到新的位置。File类提供的Move()方法和FileInfo类提供的MoveTo()方法可以实现该功能。

下面使用File类的Move()方法将my.txt文件移动为new.txt文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            File.Move(@"my.txt", "new.txt"); //移动文件
        }
    }
}

上述代码执行之后,实际上是创建了名称为new.txt的新文件,并删除了my.txt文件。

下面创建FileInfo类的实例file(表示“my.txt”文件),并调用MoveTo()方法将示例21-14中的new.txt文件移动为my.txt文件。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo file = new FileInfo("new.txt");
            file.MoveTo("my.txt");   //移动文件
        }
    }
}

 

上述代码执行之后,实际上是创建了名称为my.txt的新文件,并删除了new.txt文件。

删除文件

删除文件是指将指定的文件删除。File类提供的Delete()方法和FileInfo类提供的Delete()方法可以实现该功能。

下面使用File类的Delete()方法删除my.txt文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            File.Delete("my.txt");   
        }
    }
}

运行程序之前,确保该文件存在。FileInfo类的Delete()方法:将删除指定的文件。

下面创建FileInfo类的实例file(表示my.txt文件),并调用Delete()方法删除my.txt文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo file = new FileInfo("my.txt");
            file.Delete(); //删除文件
        }
    }
}

 

运行程序之前,确保该文件存在。

操作目录

在编程中,也会对目录有一些操作,比如创建目录、移动目录。C#提供Directory和DirectoryInfo类来处理与目录相关的操作。

Directory类

Directory类是一个静态类,它提供了操作文件夹的方法。为了方便用户使用类Directory,将一些常用的方法封装到该类中。Directory类包含多个静态方法,用来创建、移动、枚举目录和子目录。其中,常用的静态方法具体说明如下所示。

方法                                            说明
CreateDirectory()                      创建指定路径的目录
Delete()                                       删除指定的目录
Exists()                                       判断指定路径的目录是否存在如果存在,返回true,否则返回false
GetCreatI/OnTime()                  获取目录的创建日期和时间
GetCurrentDirectory()              获取应用程序的当前工作目录
GetDirectories()                        获取指定目录中子目录
GetDirectoryRoot()                   获取指定路径的卷信息或根信息
GetFiles()                                   获取指定目录中的文件
GetFileSystemEntries()           获取指定目录中所有文件和子目录
GetLastAccessTime()              获取上次访问指定文件或目录的日期和时间
GetLastWriteTime()                  获取上次写入指定文件或目录的日期和时间
GetLogicalDrives()                   获取当前计算机上的逻辑驱动器
GetParent()                                获取指定路径的父目录
Move()                                        将指定文件或目录及其内容移到新位置
SetCreatI/OnTime()                  设置指定的文件或目录的创建日期和时间
SetCurrentDirectory()              设置应用程序的当前工作目录
SetLastAccessTime()              设置上次访问指定文件或目录的日期和时间
SetLastWriteTime()                  设置上次写入目录的日期和时间

其中,CreateDirectory()、Delete()和Move()方法用来操作目录,它们依次可以用来创建、删除和移动目录。Move()方法用来移动目录,它首先创建一个新目录(包括该目录的内容),然后再将被移动的目录删除。

DirectoryInfo类

DirectoryInfo类是一个密封类,它提供操作文件夹的实例方法。Directory类和DirectoryInfo类的区别是前者不能实例化,只提供静态方法,而后者可以实例化,提供的方法与Directory类类似。微软为了方便用户使用类DirectoryInfo,将一些常用的属性封装到该类中。DirectoryInfo类包含4个属性,可以用来获取目录的名称、父目录等,具体说明如下表所示。

属性           说明
Exists        判断指定目录是否存在。如果存在,则返回true,否则返回false
Name         获取目录的名称
Parent        获取指定子目录的父目录
Root           获取路径的根部分

DirectoryInfo类还包括了以下9个属性,它们是从FileSystemInfo类继承而来。

ExtensI/On属性:获取文件扩展名部分。

FullName属性:获取完整目录。

Attributes属性:获取或设置当前目录的FileAttributes。

CreatI/OnTime属性:获取或设置当前目录的创建时间。

CreatI/OnTimeUtc属性:获取或设置当前目录的创建时间,其格式为协调通用时间。

LastAccessTime属性:获取或设置上次访问当前目录的时间。

LastAccessTimeUtc属性:获取或设置上次访问当前目录的时间,其格式为协调通用时间。

LastWriteTime属性:获取或设置上次写入当前目录的时间。

LastWriteTimeUtc属性:获取或设置上次写入当前目录的时间,其格式为协调通用时间。

为了方便用户使用类DirectoryInfo,微软还将一些常用的方法封装到该类中。调用这些方法可以对文件进行操作。DirectoryInfo类还包括实例方法,具体说明如下所示。

方法                                      说明                                                                方法                                       说明
Create()                                创建目录                                                       GetDirectories()                    获取当前目录的子目录
CreateSubdirectory()         在指定路径中创建一个或多个子目录          GetFiles()                               获取当前目录的文件列表
Delete()                                删除指定的目录及其内容                             GetFileSystemInfos()           获取当前目录的子目录和文件列表
MoveTo()                             将指定目录及其内容移到新位置    

其中,Create()、Delete()和MoveTo()方法用来操作目录,它们依次可以用来创建、删除和移动目录。MoveTo()方法用来移动目录,它首先创建一个新目录(包括该目录的内容),然后再将被移动的目录删除。

创建目录

创建目录是指新建一个新的目录。Directory类提供的CreateDirectory()方法和DirectoryInfo类提供的Create()方法可以实现该功能。DirectoryInfo类还提供了CreateSubdirectory()方法来创建一个指定目录下的子目录。

下面使用Directory类的CreateDirectory()方法创建一个名称为directory的目录。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Directory.CreateDirectory("directory");  //创建目录
        }
    }

被新创建的directory保存在应用程序所在的目录。

下面首先创建DirectoryInfo类的实例d,该实例的表示directory2目录。然后执行以下两个操作。

(1)调用Create()方法创建directory2目录。

(2)调用CreateSubdirectory()方法在directory2目录下创建subdirectory子目录。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo d = new DirectoryInfo("directory2");
            d.Create();
            d.CreateSubdirectory("subdirectory")   //创建子目录
        }
    }
}

被新创建的directory2保存在应用程序所在的目录。

删除目录

删除目录是指将指定的目录删除。Directory类提供的Delete()方法和DirectoryInfo类提供的Delete()方法可以实现该功能。Directory类的Delete()方法语法如下:

public static void Delete(string path)

上述方法删除path指定的目录,且该目录必须为空目录。

public static void Delete(string path,bool recursive)

上述方法删除path指定的目录。recursive参数指定是否删除该目录下的所有内容(如子目录、文件等)。

下面使用Directory类的Delete()方法删除名称为subdirectory的目录。被删除的目录保存在directory2目录下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Directory.Delete(@"directory2/subdirectory");   //删除子目录
        }
    }
}

 

DirectoryInfo类的Delete()方法语法如下:

public override void Delete()

上述方法删除当前实例所指定的目录,且该目录必须为空目录。

public void Delete(bool recursive)

上述方法删除当前实例所指定的目录。recursive参数指定是否删除该目录下的所有内容(如子目录、文件等)。

下面首先创建DirectoryInfo类的实例d,该实例的表示directory2\subdirectory目录。然后调用Delete()方法删除该目录。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo d = new DirectoryInfo(@"directory2/subdirectory");
            d.Delete();  //删除空目录
        }
    }
}

 

移动目录

移动目录是指将指定的目录及其内容移动到新的位置。Directory类提供的Move()方法和DirectoryInfo类提供的MoveTo()方法可以实现该功能。

下面使用Directory类的Move()方法将directory目录移动到directory3目录。上述代码执行之后,实际上是创建了名称为directory3的新目录,并删除了directory目录。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Directory.Move("directory", "directory3");
        }
    }
}

 

下面创建DirectoryInfo类的实例d(表示directory3目录),并调用MoveTo()方法将directory3目录移动到directory1目录。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo d = new DirectoryInfo("directory3");
            d.MoveTo("directory1");
        }
    }
}

 

上述代码执行之后,实际上是创建了名称为directory1的新目录,并删除了directory3目录。

遍历目录

遍历目录是指依次访问该目录下的子目录或文件。Directory类和DirectoryInfo类提供了以下6种方法来实现该功能。

Directory类的GetDirectories()方法:获取指定目录中子目录。

Directory类的GetFiles()方法:获取指定目录中的文件。

Directory类的GetFileSystemEntries()方法:获取指定目录中所有文件和子目录。

DirectoryInfo类的GetDirectories()方法:获取当前目录的子目录。

DirectoryInfo类的GetFiles()方法:获取当前目录的文件。

DirectoryInfo类的GetFileSystemInfos()方法,获取当前目录的所有文件和子目录。

下面创建Traverse(string path)方法,并使用该方法遍历path指定目录下的所有子目录和文件。该方法使用递归方法实现,具体实现步骤如下:

(1)创建DirectoryInfo类的实例d,它表示path参数的指定的目录。

(2)使用forearch语句遍历d实例指定目录下的所有子目录,并显示子目录的名称。

(3)在foreach语句中递归调用Traverse(sC#tring path)方法遍历dir实例(为d实例的子目录)的子目录和文件。

(4)使用forearch语句遍历d实例指定目录下的所有文件,并显示文件的名称。

在E盘C#文件夹下有子文件夹file1和文件1.txt,在file1文件夹中有文件1.txt和文件2.txt。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {

        void Traverse(string path)
        {
            DirectoryInfo d = new DirectoryInfo(path);  //创建实例 d 指向path
            foreach (DirectoryInfo dir in d.GetDirectories()) //访问当前的子目录
            {
                Console.WriteLine(dir.Name);  //显示子目录的名称
                Traverse(dir.FullName);   //递归调用Traverse方法
            }
            foreach (FileInfo f in d.GetFiles())  //访问当前目录的文件
            {
                Console.WriteLine(f.Name);   //显示文件名称
            }
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Traverse(@"E:/C#");
            Console.ReadKey();
        }
    }
}

 

------- Windows Phone 7手机开发.Net培训、期待与您交流! ------ 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7801次
    • 积分:248
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类