基础巩固系统(二)- 文件操作(1)
1、基础
在.Net开发中,对于文件系统操作的相关类,几乎(但不是全部)都在System.IO名称空间中。
而用于浏览文件系统和执行操作的,如移动、复制和删除文件等,有以下几个类:
System.MarshalByRefObject - 这是.Net类中用于远程操作的基对象类。它允许在应用程序域之间编组数据。
FileSystemInfo - 这个表示任何文件系统对象的基类。
FileInfo和File - 这些类表示文件系统上的文件。
DirectoryInfo 和 Directory - 这些类表示文件系统上的文件夹。
Path - 这个类包含的静态成员可以用于处理路径名。
DriveInfo - 它的属性和方法提供了指定驱动器的信息。
以上的
Directory 类和File 类只包含静态方法,不能被实例化。如果只对文件夹或者文件执行一个操作,使用这些类是很有效的,因为这样可以省去实例化.Net类的系统开销。
DirectoryInfo 和 FileInfo 类实现与Directory类和File类大致相同的公共方法,并拥有公共属性和构造函数,但他们都是有状态的,并且这些类的成员都不是静态的。
using System; using System.Collections.Generic; using System.IO;//文件操作的命名空间 namespace App20130416 { class Program { static void Main(string[] args) { FileInfo myfile = new FileInfo(@"D:\我的资料库\Downloads\11.txt");//实例化 FileInfo 对象,并读取对象初始路径的文件对象 11.txt 的信息 myfile.CopyTo(@"D:\我的资料库\Downloads\22.txt"); //创建复制到22.txt 文件 如22.txt文件存在,则会抛出异常 提示已存在 StreamReader sbr = new StreamReader(@"D:\我的资料库\Downloads\22.txt");//将22.txt文件的内容读取到文件流 //使用File类的静态方法 也一样可以做到 而且这样也可以节省部分时间,因为无需实例化对象 File.Copy(@"D:\我的资料库\Downloads\11.txt", @"D:\我的资料库\Downloads\33.txt");//创建复制到33.txt 文件 如33.txt文件存在,则会抛出异常 提示已存在 StreamReader sbr2 = new StreamReader(@"D:\我的资料库\Downloads\33.txt");//将22.txt文件的内容读取到文件流 //输出信息 Console.WriteLine("FileInfo对象操作复制文件:"); Console.Write(sbr.ReadToEnd());//输出读取的文件流 Console.WriteLine("\n\r-----------------");//输出一个空行 间隔输出信息 Console.WriteLine("File类静态方法操作复制文件:"); Console.Write(sbr2.ReadToEnd());//输出读取的文件流 Console.ReadLine();//为了等待输入,可以查看上面的情况 } } }
对于文件夹(或者“目录”)的操作,就可以实例化DirectoryInfo或者使用Directory类。
using System; using System.Collections.Generic; using System.IO;//文件操作的命名空间 namespace App20130416 { class Program { static void Main(string[] args) { /******** * 对于文件夹(或者“目录”)的操作,就可以实例化DirectoryInfo或者使用Directory类 * *********/ DirectoryInfo myFolder = new DirectoryInfo(@"C:\My");//通过文件夹路径字符串 实例化DirectoryInfo对象 myFolder.Delete();//删除此文件夹 } } }
运行以上代码,你会发现,报错了.....
这个是为什么呢?为什么DirectoryInfo类在实例化的时候没有抛出异常,却在调用其实例方法时候抛出了异常呢?
原因很简单,因为DirectoryInfo类在通过文件夹路径字符串实例化对象时,是不会对路径进行验证的,而在其调用实例方法的时候,才会对其进行验证。
所以,我们可以进行以下操作:
using System; using System.Collections.Generic; using System.IO;//文件操作的命名空间 namespace App20130416 { class Program { static void Main(string[] args) { /******** * 对于文件夹(或者“目录”)的操作,就可以实例化DirectoryInfo或者使用Directory类 * *********/ DirectoryInfo myFolder = new DirectoryInfo(@"C:\My");//通过文件夹路径字符串 实例化DirectoryInfo对象 if (myFolder.Exists)//判断文件目录是否存在 { //如果存在 myFolder.Delete();//删除此文件夹 Console.WriteLine(@"C:\My 路径存在!"); } else { Console.WriteLine(@"C:\My 路径不存在!"); } Console.ReadLine();//等待输入 方便查看结果 } } }
运行结果如下:
很显然,提示路径不存在!
常用属性列表:
名称作用
CreationTime创建文件或文件夹的时间
DirectoryName(仅用于FileInfo) | 包含文件夹的完整路径名 |
Parent(仅用于DirectoryInfo) | 指定子目录的父目录 |
Exists | 文件或文件夹是否存在 |
Extension | 文件的扩展名,对于文件夹返回空白 |
FullName | 文件或文件夹的完整路径名 |
LastAccessTime | 最后一次访问文件或文件夹的时间 |
LastWriteTime | 最后一次修改文件或文件夹的时间 |
Name | 文件或文件夹的名称 |
Root(仅用于DirectoryInfo) | 路径的根部分(磁盘名称) |
Length(仅用于FileInfo) | 返回文件的大小(以字节为单位) |
常用方法列表:
名称 | 作用 |
Create() | 创建给定名称的文件夹或者空文件。对于FileInfo,该方法会返回一个流对象,以便写入文件。 |
Delete() | 删除文件或者文件夹。对于文件夹,有一个可以递归的Delete选项。 |
MoveTo() | 移动和/或重命名文件或文件夹。 |
CopyTo() | (只适用FileInfo)复制文件,注意文件夹没有复制方法。如果复制完整的目录树,需要单独复制每个文件,创建对应于旧文件夹的新文件。 |
GetDiectories() | (只适用于DirectoryInfo)返回DirectoryInfo对象数组,该数组表示文件夹中包含的所有文件夹。 |
GetFiles() | (只适用于FileInfo)返回FileInfo对象数组,该数组表示文件夹中包含的所有文件。 |
GetFileSystemInfos() | 返回FileInfo和DirectoryInfo对象,它把文件夹中包含的所有对象表示为一个FileSystemInfo引用数组。 |
DirectoryInfo myFolder = new DirectoryInfo(@"C:\My");//通过文件夹路径字符串 实例化DirectoryInfo对象 if (!myFolder.Exists)//判断文件目录是否存在 myFolder.Create();//不存在 则创建文件夹 //输出文件目录信息 Console.WriteLine(myFolder.CreationTime.ToString());//输出文件目录的创建时间 Console.WriteLine(myFolder.Parent.ToString());//输出 其上级目录 Console.WriteLine(myFolder.Root.ToString());//输出 路径的根部分(磁盘名称) Console.WriteLine(myFolder.FullName);//输出 文件夹的完整路径名 Console.ReadLine();//等待输入 方便查看结果
输出结果信息如下:
中间输出上级目录 为空?这个理由很简单,因为C:\My路径的上级目录就为磁盘C了,所以不存在上级目录了,故为空。
2、Path类
path类不能够实例化,但他提供了一些静态方法,可以很容易的对路基名进行操作。
例如,我要显示文件夹 D:\我的资料库\Downloads 中的 11.txt 文件的完整路径名,可以用以下代码查找文件的路径
//Combine方法: 将字符串数组组合成一个路径 Console.WriteLine(System.IO.Path.Combine(@"D:\我的资料库\Downloads", "11.txt")); Console.ReadLine();
输出结果如下:
好,可能你会问我,直接拼凑字符串不就可以了吗?
好,那我告诉你答案:因为Path类在处理不同操作系统上的路径时,能够识别不同的格式。例如:windows上是用“\”作为路径的分割符号,
而UNIX上路径的分割符号是“/”,所以如果现在的系统要移植到UNIX或者其它非Windows系统上,那岂不是会识别不了,甚至发生错误。
所以,出于这样的考虑还是推荐使用Path类来拼接路径字符串。
Path类的一些静态字段:
属性 | 说明 |
AltDirectorySeparatorChar | 提供一种与平台无关的方式,来指定分隔目录级别的另一个字符。在windows上使用“/”符号,而在UNIX上使用“\”符号。 |
DirectorySeparatorChar | 提供一种与平台无关的方式,来指定分隔目录级别的另一个字符串。在windows上使用“/”符号,在UNIX上使用“\”符号。 |
PathSeparator | 提供一种与平台无关的方式,来指定划分环境变量的路径字符串,默认为分号 |
VolumeSeparatorChar | 提供一种与平台无关的方式,来指定容量分隔符,默认为冒号 |