详细总结C#中的文件和I/O流之文件和目录(File 、 FileInfo、Directory、DirectoryInfo和Path)

详细总结C#中的文件和I/O流之文件和目录(File 、 FileInfo、Directory、DirectoryInfo和Path)

C#进阶笔记系列,帮助您强化C#基础,资料整理不易,欢迎关注交流!

文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。 在 .NET 中, System.IO 命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。

常用的文件和目录类:

  • File :提供用于创建、复制、删除、移动和打开文件的 静态方法 ,并可帮助创建 FileStream对象。
  • FileInfo : 提供用于创建、复制、删除、移动和打开文件的 实例方法 ,并可帮助创建 FileStream对象。
  • Directory:提供用于创建、移动和枚举目录和子目录的 静态方法
  • DirectoryInfo: 提供用于创建、移动和枚举目录和子目录的 实例方法
  • Path:提供用于以跨平台的方式处理目录字符串的方法和属性。

调用文件系统方法时,还提供强大的异常处理。

1 Flie类

提供用于创建、复制、删除、移动和打开单一文件的静态方法,并协助创建 FileStream 对象。

File是静态类,它不属于特定对象,所以不能被实例化,只能 通过File.方法名调用其方法

1.1常用属性、方法

基本操作 属性或方法
文件是否存在 File.Exist(),例如:Bool flag=file.exists(path) //返回True/False
移动文件 File.Move(),例如:File.Move(path,新path, true) // 第三个位置参数是否覆盖重名文件
删除文件 File.Delete(),例如File.Delete(@"文件路径");
创建文件 File.create(),例如:File.Create(@"文件路径");
复制文件 File.Copy();,例如:File.Copy(被复制文件路径,新文件路径, true) // 第三个位置参数是否覆盖重名文件
返回指定文件或目录的创建日期和时间 DateTime GetCreationTime(string path)
返回上次访问指定文件或目录的日期和时间 DateTime GetLastAccessTime(string path)
返回上次写入指定文件或目录的日期和时间 void SetCreationTime(string path, DateTime creationTime)
设置创建该文件的日期和时间 void SetCreationTime(string path, DateTime creationTime)
设置上次访问指定文件的日期和时间 void SetLastAccessTime(string path, DateTime lastAccessTime)
设置上次写入指定文件的日期和时间 void SetLastWriteTime(string path, DateTime lastWriteTime)
打开一个文件,向其中追加指定的字符串,并设置编码格式,然后关闭该文件。 如果文件不存在,此方法将创建一个文件,将指定的字符串写入文件,然后关闭该文件。 AppendAllText(String, String,Encoding)
读取具有指定编码的文件的行。 ReadLines(String,Encoding)
以异步形式创建一个新文件,使用指定编码在其中写入指定的字符串,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。 WriteAllTextAsync(String, String, Encoding, CancellationToken)
创建一个新文件,使用指定编码向其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则覆盖该文件。 WriteAllText(String, String, Encoding)
C#中 DateTime 的表达格式可见 docs.microsoft.com/zh-c
例如:
//DateTime(int year, int month, int day, int hour, int minute, int second);
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("yyyyMMddTHH:mm:ssZ"));

1.2 代码示例(详细)

using System;
using System.IO;
using System.Text;
class Test
    public static void Main()
        string path = @"G:\Desktop\MyTest.txt";
        if (!File.Exists(path))
            //写入内容到文件
            using (StreamWriter sw = File.CreateText(path))
                sw.WriteLine("Hello");
                sw.WriteLine("And");
                sw.WriteLine("Welcome");
        //复制文件
        string path1 = @"G:\Desktop\MyTest1.txt";
        File.Copy(path, path1,true);
        // 读取复制的文件中的内容
        using (StreamReader sr = File.OpenText(path1))
            string s;
            while ((s = sr.ReadLine()) != null)
                Console.WriteLine(s);
        //获取上次访问指定文件或目录的日期和时间
        DateTime datetime = File.GetLastAccessTime(path1);
        Console.WriteLine(datetime.ToString());
        //设置创建该文件的日期和时间
        DateTime Createtime = new DateTime(2008,3,1,7,0,0);
        Console.WriteLine(Createtime.ToString("yyyyMMddTHH:mm:ssZ"));
        File.SetCreationTime(path1, Createtime);
        //打开文件并向其中追加指定的字符串
        //var file1 = new File(path1);//它不属于特定对象,所以不能被实例化。
        string alltext = "欢迎关注\n" +
                        "智能建造小硕";
        File.AppendAllText(path1, alltext);
        //读取文件中的字符串并在控制台输出
        string allcontent =  File.ReadAllText(path1, encoding:Encoding.UTF8);
        Console.Write(allcontent);

运行结果:

Hello
Welcome
2022/8/23 14:42:55
20080301T07:00:00Z
Hello
Welcome
智能建造小硕

2 FileInfo

提供用于创建、复制、删除、移动和打开文件的属性和实例方法,并且帮助创建 FileStream 对象。 此类不能被继承。如果要对同一文件执行多个操作,则使用 FileInfo实例方法(而不是类的相应静态方法 File)可能更高效,因为安全检查并不总是必要的。

实例化:var fi1 = new FileInfo(path);

2.1 常用属性、方法

操作 属性或方法
获取父目录的实例 Directory
获取指示文件是否存在 Exists
获取当前文件的大小(以字节为单位) Length
获取文件名 Name
获取目录或文件的完整目录 FullName
获取或设置确定当前文件是否为只读的值 IsReadOnly
此实例表示的文件追加文本 AppendText()
将现有文件复制到新文件,并设置是否覆盖现有的文件 CopyTo(String, Boolean)
创建写入新文本文件的 StreamWriter(专门用来处理文本文件的类,可向文件写入字符串) CreateText()
永久删除文件 Delete()
确定指定对象是否等于当前对象 Equals(Object)
将指定文件移动到新位置,提供指定新文件名,并指定是否覆盖 MoveTo(String, Boolean)
用读、写或读/写访问权限和指定的共享选项在指定的模式中打开文件 Open(FileMode, FileAccess, FileShare)
创建使用从现有文本文件中读取的 UTF8 编码的 StreamReader OpenText()
以字符串形式返回路径 ToString()
对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。 还指定是否忽略合并错误。 Replace(String, String, Boolean)

2.2 代码示例

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using static System.Net.Mime.MediaTypeNames;
class Test
    public static void Main()
        //磁盘上创建一个唯一命名的零字节临时文件并返回该文件的完整路径。
        string path = Path.GetTempFileName();
        //以Path实例化一个FileInfo
        FileInfo fi1 = new FileInfo(path);
        // 使用CreateText()写入数据
        using (StreamWriter sw = fi1.CreateText())
            sw.WriteLine("Hello");
            sw.WriteLine("And");
            sw.WriteLine("Welcome");
        // 使用OpenText读取数据
        using (StreamReader sr = fi1.OpenText())
            var s = "";
            while ((s = sr.ReadLine()) != null) //一行一行的读,如果是空行不打印
                Console.WriteLine(s);
            String path2 = @"G:\Desktop\Test.txt";
            // 复制文件到path2
            FileInfo file2 = fi1.CopyTo(path2, true);
            Console.WriteLine($"{fi1.FullName} 复制到 {file2.Name}.");
            File.Create(@"G:\Desktop\Test3.txt").Close();
            //查看文件大小            
            string s = file2.Length.ToString();
            Console.WriteLine(s);
            using (StreamReader sr = file2.OpenText())
                String ss;
                while ((ss = sr.ReadLine()) != null)
                    Console.WriteLine(ss);
            // 删除复制的文件
            file2.Delete();
            //判断是否存在文件
            string A;
            if (file2.Exists)
            { A = "存在"; }
            { A = "不存在"; }
            Console.WriteLine($"文件{A}");
        catch (Exception e)
            Console.WriteLine($"运行时出错: {e.ToString()}");

运行结果:

Hello
Welcome
C:\Users\24576\AppData\Local\Temp\tmpBA66.tmp 复制到 Test.txt.
Hello
Welcome
文件不存在

3 Directory 类

用于通过目录和子目录进行创建、移动和枚举的静态方法。

3.1 常用方法和属性:

操作 属性或方法
在指定路径中创建所有目录和子目录,除非它们已经存在。 CreateDirectory(String)
删除指定的目录,并删除该目录中的所有子目录和文件(如果表示) Delete(String, Boolean)
返回指定路径中的目录完整名称的可枚举集合 EnumerateDirectories(String)
确定给定路径是否引用磁盘上的现有目录 Exists(String)
获取应用程序的当前工作目录 GetCurrentDirectory()
返回指定目录中的子目录的名称(包括其路径) GetDirectories(String)
返回指定目录中文件的名称(包括其路径) GetFiles(String)
返回指定目录中与指定的搜索模式匹配的文件的名称(包含其路径) GetFiles(String, String)
返回指定目录中与指定的搜索模式匹配的文件的名称(包含其路径),使用某个值确定是否要搜索子目录(AllDirectories,TopDirectoryOnly) GetFiles(String, String, SearchOption)
将文件或目录及其内容移到新位置(不能跨盘移动) Move(String, String)

3.2 代码示例

public static void Main()
        //新建两个目录
        string sourceDirectory = @"G:\Desktop\current";
        string archiveDirectory = @"G:\Desktop\archive";
        Directory.CreateDirectory(sourceDirectory);
        Directory.CreateDirectory(archiveDirectory);
        //手动把一些文件放入current文件夹哈
            Console.WriteLine("###移动一个文件夹的文件到另一文件夹###".PadLeft(30));
            //返回指定路径中的目录完整名称的可枚举集合,
            //"*.txt"表示匹配任意文件名加.TXT后缀(也叫做扩展名)的文件
            var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt");
            //txtFiles为一个可迭代的对象
            foreach (string currentFile in txtFiles)
                //Substring截取字符串,返回截取范围外的字符
                string fileName = currentFile.Substring(sourceDirectory.Length + 1);
                //移动文件或文件夹
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
            var filess = Directory.GetFiles(archiveDirectory);
            Console.WriteLine($"移动完毕,移动了{filess.Length}个文件");
            Console.WriteLine("从目录中检索文本文件的集合,然后在查询中使用该集合查找包含“Example”的所有行".PadLeft(30));
            //C#中的lambda表达式
            //from:用来表示迭代变量;
            //in:表示迭代的集合;
            //select:表示我们需要去让什么变量作为返回;
            //into:表示继续使用迭代结果;
            //where:表示条件;
            var files = 
                    from retrievedFile in Directory.GetFiles(archiveDirectory, "*.txt", SearchOption.AllDirectories)
                    from line in File.ReadLines(retrievedFile) where line.Contains("Example")
                    select new  {
                        File = retrievedFile,
                        Line = line
            foreach (var f in files)
                Console.WriteLine("{0} 包含 {1}", f.File, f.Line);
            Console.WriteLine("找到{0}行", files.Count().ToString());
            //获取当前的程序运行的目录
            Console.WriteLine(Directory.GetCurrentDirectory());           
        catch (Exception e)
            Console.WriteLine(e.Message);

运行结果:

        ###移动一个文件夹的文件到另一文件夹###
移动完毕,移动了3个文件
从目录中检索文本文件的集合,然后在查询中使用该集合查找包含“Example”的所有行
G:\Desktop\archive\MyTest.txt 包含 Welcome Example
G:\Desktop\archive\MyTest.txt 包含 Example
G:\Desktop\archive\Test3.txt 包含 ExampleExample
G:\Desktop\archive\Test3.txt 包含 Example
找到4
G:\Desktop\博客文章\C#高级基础学习\Practice2\FileAndStream\ConsoleApp1\bin\Debug\net6.0

4 DirectoryInfo

公开用于创建、移动和枚举目录和子目录的实例方法。 此类不能被继承,与FileInfo对应。

4.1 常用方法和属性:

操作 属性或方法
初始化指定路径上的DirectoryInfo实例 DirectoryInfo(String)
指示目录是否存在 Exists
获取文件名的扩展名部分,包括前导点 . 即使它是整个文件名,或者不存在扩展名的空字符串。 Extension
获取此 DirectoryInfo实例的名称 Name
获取目录的根部分 Root
创建目录 Create()
删除 DirectoryInfo的此实例,指定是否删除子目录和文件。 Delete(Boolean)
返回当前目录中的文件信息的可枚举集合 EnumerateFiles()
返回当前目录的子目录 GetDirectories()
返回当前目录的文件列表 GetFiles()
刷新对象的状态 Refresh()

4.2 代码示例:

public static void Main()
        // 实例化需要进行操作的文件
        DirectoryInfo di = new DirectoryInfo(@"G:\Desktop\archive");
        DirectoryInfo di1 = new DirectoryInfo(@"G:\Desktop\archive1");
        // 创建archive1文件夹
        di1.Create();
            // 是否存在
            if (di.Exists)
                Console.WriteLine("文件夹存在");
                foreach (FileInfo fi in di.GetFiles("*.txt"))
                    Console.WriteLine(@"Copying {0}\{1}", di1.FullName, fi.Name);
                    fi.CopyTo(Path.Combine(di1.ToString(), fi.Name), true);
            //删除archive文件夹,不是空也删除
            di.Delete(true);
            Console.WriteLine(di.Exists);
        catch (Exception e)
            Console.WriteLine("运行出错 {0}", e.ToString());
        finally { }

运行结果:

文件夹存在
Copying G:\Desktop\archive1\MyTest.txt
Copying G:\Desktop\archive1\MyTest1.txt
Copying G:\Desktop\archive1\Test3.txt
False

5 Path

对包含文件或目录路径信息的 String实例执行操作,Path类的所有成员都是静态的。

路径是提供文件或目录位置的字符串。 路径不一定指向磁盘上的位置;例如,路径可能映射到内存中或设备上的位置。 路径的确切格式由当前平台确定。 例如,在某些系统上,路径可以从驱动器或卷号开始,而此元素在其他系统中不存在。

路径可以包含绝对或相对位置信息。 绝对路径完全指定位置:无论当前位置如何,都可以唯一标识文件或目录。 相对路径指定部分位置:定位使用相对路径指定的文件时,当前位置用作起点。

5.1常用方法和属性

操作 属性或方法
更改路径字符串的扩展名 ChangeExtension(String, String)
将四个字符串组合成一个路径,自动处理路径分隔符的问题,当String2是相对路径的时候,返回的是String2后面的,String1被抛弃 Combine(String1, String2, String3, String4)
返回指定路径字符串的扩展名(包括句点“.”) GetExtension(String)
返回指定路径字符串的文件名和扩展名 GetFileName(String)
将四个路径连接到一个路径中 Join(String, String, String, String)

5.2代码示例

public static void Main()
        var path1 = "C:/Program Files/";
        var path2 = "Utilities/SystemUtilities";
        ShowPathInformation(path1, path2);
        path1 = "C:/";
        path2 = "/Program Files";
        ShowPathInformation(path1, path2);
        path1 = "C:/Users/Public/Documents/";
        path2 = "C:/Users/User1/Documents/Financial/智能建造小硕公众号.txt";
        ShowPathInformation(path1, path2);
        //以上可在结果中查看Path.Join与Path.Combine的区别
        Console.WriteLine("".PadLeft(60, '-'));
        string path3 = Path.Combine(path1, path2);
        if (Path.HasExtension(path3))
            Console.WriteLine("{0}路径下有扩展{1}", path3, Path.GetExtension(path3));
        if (Path.IsPathRooted(path3))
            Console.WriteLine($" {path3} 有根路径");
        Console.WriteLine("{0}的全路径是 {1}.", path3, Path.GetFullPath(path3));
        Console.WriteLine("{0} 是一个临时路径.", Path.GetTempPath());
        Console.WriteLine("{0}可以被使用.", Path.GetTempFileName());
    private static void ShowPathInformation(string path1, string path2)
        var result = Path.Join(path1.AsSpan(), path2.AsSpan());
        Console.WriteLine($"Concatenating  '{path1}' and '{path2}'");
        Console.WriteLine($"   Path.Join:     '{result}'");
        Console.WriteLine($"   Path.Combine:  '{Path.Combine(path1, path2)}'");

运行结果:

Concatenating  'C:/Program Files/' and 'Utilities/SystemUtilities'
   Path.Join:     'C:/Program Files/Utilities/SystemUtilities'
   Path.Combine:  'C:/Program Files/Utilities/SystemUtilities'
Concatenating  'C:/' and '/Program Files'
   Path.Join:     'C://Program Files'
   Path.Combine:  '/Program Files'
Concatenating  'C:/Users/Public/Documents/' and 'C:/Users/User1/Documents/Financial/智能建造小硕公众号.txt'
   Path.Join:     'C:/Users/Public/Documents/C:/Users/User1/Documents/Financial/智能建造小硕公众号.txt'
   Path.Combine:  'C:/Users/User1/Documents/Financial/智能建造小硕公众号.txt'
------------------------------------------------------------