基础巩固系统(二)- 文件操作(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();//删除此文件夹 

        }
    }
}

  

运行以上代码,你会发现,报错了.....

基础巩固系统(二)- 文件操作(1)_第1张图片

这个是为什么呢?为什么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();//等待输入 方便查看结果
        }
    }
}

  

运行结果如下:

基础巩固系统(二)- 文件操作(1)_第2张图片

很显然,提示路径不存在!

常用属性列表:

名称作用

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();//等待输入 方便查看结果

  

输出结果信息如下:

基础巩固系统(二)- 文件操作(1)_第3张图片

中间输出上级目录 为空?这个理由很简单,因为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 提供一种与平台无关的方式,来指定容量分隔符,默认为冒号

你可能感兴趣的:(文件操作)