流
在.NET Framework中进行的所有输入和输出工作都要用到流(stream)。流是序列化设备的抽象表示。序列化设备可以线性方式存储数据,并按照同样的方式访问:一次访问一个字节。
此设备可以是磁盘文件、网络通道、内存位置或其他支持一线性方式读写的对象。把设备变成抽象的,就可以隐藏流的底层目标和源。
有两种类型的流:
- 输出流: 当向某些外部目标写入数据时,就要用到输出流。这可以是物理磁盘文件、网络位置、打印机或另一个程序。
- 输入流: 用于将数据读入程序可以访问的内存或变量中。到目前为止,我们使用的最常见的输入流形式是键盘。输入流可以来自任何源,在此主要关注读取磁盘文件。适用于读/写磁盘文件的概念也适用于大多数设备。
System.IO命名空间
System.IO命名空间包含允许在数据流和文件上进行同步和异步读取及写入的类型。这里需要注意文件和流的差异,文件 是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。流是提供一种向后备存储写入字节和从后备存储读取字节的方式。
System.IO命名空间中的一些类及说明:
类 | 说明 |
---|---|
File | 静态实用类,提供许多静态方法,用于移动、复制和删除文件 |
Directory | 静态实用类,提供许多静态方法,用于移动、复制和删除目录 |
Path | 实用类,用于处理路径名称 |
FileInfo | 表示磁盘上的物理文件,该类包含处理此文件的方法。要完成对文件的读写工作,就必须创建Stream对象。 |
DirectoryInfo | 表示磁盘上的物理目录,该类包含处理此目录的方法。 |
FileSystemInfo | 用作FileInfo和DirectoryInfo的基类,可以使用多态性同时处理文件和目录。 |
FileStream | 表示可写或可读,或二者均可的文件。可以同步或异步地读写文件。 |
StreamReader | 从流中读取字符数据,可以使用FileStream作为基类创建。 |
StreamWriter | 向流写入字符数据,可以使用FileStream作为基类创建 |
FileSystemWatcher | 用于监控文件和目录,提供了这些文件和目录发生变化时应用程序可以捕获的事件。 |
File类和Directory类
File类和Directory类分别用来对文件和各种目录进行操作,这两个类可以被实例化,但不能被其它类继承。
File类和Directory类就好比一个工厂,文件和文件夹就好比工厂所制作的产品,而工厂和产品的关系主要表现在以下几个方面:工厂可以自行开发产品(文件和文件夹的创建),也可以对该产品进行批量生产(文件和文件夹的复制,将产品进行销售(文件和文件夹的移动)以及将有质量问题的产品进行回收消除(文件和文件夹删除)。
File类
File类支持对文件的基本操作,它包括用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。
方法 | 说明 |
---|---|
Copy() | 将文件从源位置复制到目标位置 |
Create() | 在指定的路径上创建文件 |
Delete() | 删除文件 |
Open() | 返回指定路径上的FileStream对象 |
Move() | 将指定的文件移到新位置。可在新位置为文件指定不同名称 |
Exists() | 确定指定的文件是否存在 |
Replace | 使用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份 |
说明:
- 由于File类中的所有方法都是静态的,所以如果只想执行一个操作,那么使用File类中方法的效率比使用相应的FileInfo类中的方法可能更高。
- File类的静态方法对所有方法都执行安全检查,因此如果打算多次重用某个对象,可考虑改用FileInfo类中的相应方法,因为并不总是需要安全检查。
Directory类
Directory类公开了用于创建、移动、枚举、删除目录和子目录的静态方法。
方法 | 说明 |
---|---|
CreateDirectory() | 创建具有指定路径的目录 |
Delete() | 删除指定的目录及其中的所有文件 |
GetDirectories() | 返回表示指定目录下的目录名的string对象数组 |
EnumerateDirectories | 与GetDirectories()类似,但返回目录名的IEnumerable集合 |
GetFiles() | 返回在指定目录中的文件名的string对象数组 |
EnumerateFiles() | 与GetFiles()类似,但返回文件名的IEnumerable集合 |
GetFilesSystemEntries() | 返回指定目录中的文件和目录名的string对象数组 |
EnumerateFileSystemEntries() | 与GetFilesSystemEntries()类似,但返回文件和目录名的IEnumerable集合 |
Move() | 将指定目录移到新位置。可在新位置为文件夹指定一个新名称 |
FileInfo和DirectoryInfo类
使用FileInfo和DirectoryInfo类可以方便地对文件和文件夹进行操作
FileInfo
FileInfo类和File类之间许多方法调用都是相同的,但是FileInfo类没有静态方法,该类中的方法仅可以用于实例化的对象。File类是静态类,所以它的调用需要字符串参数为每一个方法调用规定文件的位置。因此如果要在对象上进行单一方法调用,则可以使用静态File类。
FileInfo对象表示磁盘或网络位置上的文件。提供文件路径,就可以创建一个FileInfo对象。
c#
FileInfo fi = new FileInfo(@"F:\Log.txt");
FileInfo类的常用属性及说明:
属性 | 说明 |
---|---|
CreationTime | 获取或设置当前FileSystemInfo对象的创建时间 |
Directory | 获取父目录的实例 |
DirectoryName | 获取表示目录的完整路径的字符串 |
Exist | 获取指定文件是否存在的值 |
Extension | 获取表示文件扩展名部分的字符串 |
FullName | 获取目录或文件的完整目录 |
IsReadOnly | 获取或设置确定当前文件是否只读的值 |
LastAccessTime | 获取或设置上次访问当前文件或目录的时间 |
LastWriteTime | 获取或设置上次写入当前文件或目录的时间 |
length | 获取当前文件的大小 |
Name | 获取文件名 |
c#
private void button1_Click(object sender, EventArgs e)
{
if(textBox1.Text == string.Empty)//判断输入的文件名称是否为空
{
MessageBox.Show("文件名称不能为空!");
}
else
{
FileInfo finfo = new FileInfo(textBox1.Text);//实例化FileInfo类对象
if(finfo.Exists)//使用FileInfo对象的Exists属性判断要创建的文件是否存在
{
MessageBox.Show("该文件已经存在");
}
else
{
finfo.Create(); //使用FileInfo对象的Create方法创建文件
}
}
}
DirectoryInfo
DirectoryInfo类的作用类似于FileInfo类。它是一个实例化的对象,表示计算机上的单一目录。
- 如果执行单一调用,就使用静态Directory类。
- 如果执行一系列调用,则使用实例化的DirectoryInfo对象。
DirectoryInfo类的大多数属性继承自FileSystemInfo,与FileInfo类一样,但这些属性作用于目录上,而不是文件上。还有两个DirectoryInfo专用属性。
属性 | 说明 |
---|---|
parent | 检索一个DirectoryInfo对象,表示包含当前目录的目录。这个属性是只读的 |
Root | 检索一个DirectoryInfo对象,表示包含当前目录的跟目录。这个属性是只读的。 |