• 学习c#的第十八天


    目录

    C# 文件的输入与输出

    C# I/O 类

    FileStream 类

    文本文件的读写

    StreamReader 类

    StreamWriter 类

    实例

    二进制文件的读写

    BinaryReader 类

    BinaryWriter 类

    实例

    Windows 文件系统的操作

    DirectoryInfo 类

    FileInfo 类

    实例


    C# 文件的输入与输出

    一个 文件 是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个 流。

    从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流 和 输出流。输入流用于从文件读取数据(读操作),输出流用于向文件写入数据(写操作)。

    C# I/O 类

    System.IO 命名空间有各种不同的类,用于执行各种文件操作,如创建和删除文件、读取或写入文件,关闭文件等。

    下表列出了一些 System.IO 命名空间中常用的非抽象类:

    I/O 类描述
    BinaryReader从二进制流读取原始数据。
    BinaryWriter以二进制格式写入原始数据。
    BufferedStream字节流的临时存储。
    Directory有助于操作目录结构。
    DirectoryInfo用于对目录执行操作。
    DriveInfo提供驱动器的信息。
    File有助于处理文件。
    FileInfo用于对文件执行操作。
    FileStream用于文件中任何位置的读写。
    MemoryStream用于随机访问存储在内存中的数据流。
    Path对路径信息执行操作。
    StreamReader用于从字节流中读取字符。
    StreamWriter用于向一个流中写入字符。
    StringReader用于读取字符串缓冲区。
    StringWriter用于写入字符串缓冲区。

    FileStream 类

    FileStream 类是位于 System.IO 命名空间中的一个重要类,它主要用于文件的读写操作以及文件的关闭。作为 System.IO 命名空间中的一部分,FileStream 类继承自抽象类 Stream,这意味着它包含了许多用于处理字节流的方法和属性。

    您需要创建一个 FileStream 对象来创建一个新的文件,或打开一个已有的文件。创建 FileStream 对象的语法如下:

    1. FileStream = new FileStream( ,
    2. , , );

    例如,创建一个 FileStream 对象 F 来读取名为 sample.txt 的文件:

    FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
    
    参数描述
    FileMode

    FileMode 枚举定义了各种打开文件的方法。FileMode 枚举的成员有:

    • Append:打开一个已有的文件,并将光标放置在文件的末尾。如果文件不存在,则创建文件。
    • Create:创建一个新的文件。如果文件已存在,则删除旧文件,然后创建新文件。
    • CreateNew:指定操作系统应创建一个新的文件。如果文件已存在,则抛出异常。
    • Open:打开一个已有的文件。如果文件不存在,则抛出异常。
    • OpenOrCreate:指定操作系统应打开一个已有的文件。如果文件不存在,则用指定的名称创建一个新的文件打开。
    • Truncate:打开一个已有的文件,文件一旦打开,就将被截断为零字节大小。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。如果文件不存在,则抛出异常。
    FileAccess

    FileAccess 枚举的成员有:

    • Read:表示以只读方式打开文件,允许读取文件的内容但不允许进行写入操作。
    • ReadWrite:表示以读写方式打开文件,允许既读取文件的内容又进行写入操作。
    • Write:表示以只写方式打开文件,允许进行写入操作但不允许读取文件的内容。
    FileShare

    FileShare 枚举的成员有:

    • Inheritable:允许文件句柄可由子进程继承。Win32 不直接支持此功能。
    • None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
    • Read:允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
    • ReadWrite:允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
    • Write:允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
    • Delete:允许随后删除文件。

    下面是一个简单的示例, 

    1. using System;
    2. using System.IO;
    3. class Program
    4. {
    5. static void Main()
    6. {
    7. // 文件路径
    8. string filePath = "D:/example.txt";
    9. // 使用 Create 模式打开文件,如果文件已存在则覆盖,不存在则创建新文件
    10. using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    11. {
    12. // 准备要写入文件的内容
    13. string content = "你好,文件流!这是一个使用C#写入文件的示例。";
    14. // 将字符串转换为字节数组
    15. byte[] data = System.Text.Encoding.UTF8.GetBytes(content);
    16. // 向文件中写入数据
    17. fileStream.Write(data, 0, data.Length);
    18. }
    19. // 使用 Open 模式打开文件,以只读方式访问
    20. using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    21. {
    22. // 准备一个缓冲区来存储从文件中读取的数据
    23. byte[] buffer = new byte[1024];
    24. // 从文件中读取数据
    25. int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
    26. // 将读取到的字节数组转换为字符串
    27. string result = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
    28. // 输出从文件中读取的内容
    29. Console.WriteLine("文件内容: " + result);
    30. }
    31. }
    32. }

     在这个示例中,我们首先使用 FileStream 创建了一个新文件,并使用 FileMode.Create 和 FileAccess.Write 参数进行了写入操作。然后使用相同的文件路径和 FileMode.Open、FileAccess.Read 参数创建了另一个 FileStream 对象,以只读方式访问文件,并从中读取数据。最后,将读取到的数据转换为字符串并输出。

    通过适当设置 FileMode 和 FileAccess 参数,可以根据需求对文件进行不同的操作。同时,务必在使用完毕后关闭文件流,以确保资源得到正确释放。

    文本文件的读写

    StreamReader 和 StreamWriter 类用于文本文件的数据读写。这些类从抽象基类 Stream 继承,Stream 支持文件流的字节读写。

    StreamReader 类

    StreamReader 类继承自抽象基类 TextReader,表示阅读器读取一系列字符。

    下表列出了 StreamReader 类中一些常用的方法

    序号方法 & 描述
    1public override void Close()
    关闭 StreamReader 对象和基础流,并释放任何与读者相关的系统资源。
    2public override int Peek()
    返回下一个可用的字符,但不使用它。
    3public override int Read()
    从输入流中读取下一个字符,并把字符位置往前移一个字符。

    如需查看完整的方法列表,请访问微软的 C# 文档

    StreamWriter 类

    StreamWriter 类继承自抽象类 TextWriter,表示编写器写入一系列字符。

    下表列出了 StreamWriter 类中一些常用的方法

    序号方法 & 描述
    1public override void Close()
    关闭当前的 StreamWriter 对象和基础流。
    2public override void Flush()
    清理当前编写器的所有缓冲区,使得所有缓冲数据写入基础流。
    3public virtual void Write(bool value)
    把一个布尔值的文本表示形式写入到文本字符串或流。(继承自 TextWriter。)
    4public override void Write( char value )
    把一个字符写入到流。
    5public virtual void Write( decimal value )
    把一个十进制值的文本表示形式写入到文本字符串或流。
    6public virtual void Write( double value )
    把一个 8 字节浮点值的文本表示形式写入到文本字符串或流。
    7public virtual void Write( int value )
    把一个 4 字节有符号整数的文本表示形式写入到文本字符串或流。
    8public override void Write( string value )
    把一个字符串写入到流。
    9public virtual void WriteLine()
    把行结束符写入到文本字符串或流。

    如需查看完整的方法列表,请访问微软的 C# 文档

    实例

    1. using System;
    2. using System.IO;
    3. class Program
    4. {
    5. static void Main()
    6. {
    7. string filePath = "D:/dexample.txt";
    8. // 使用 StreamWriter 写入文件
    9. using (StreamWriter writer = new StreamWriter(filePath))
    10. {
    11. writer.WriteLine("你好!这是一个使用C#写入文件的示例。");
    12. writer.WriteLine("这是另一行文字。");
    13. }
    14. // 使用 StreamReader 读取文件
    15. using (StreamReader reader = new StreamReader(filePath))
    16. {
    17. string line;
    18. while ((line = reader.ReadLine()) != null)
    19. {
    20. Console.WriteLine(line);
    21. }
    22. }
    23. }
    24. }

    在这个示例中,我们首先使用 StreamWriter 打开文件并写入了两行文本。然后使用 StreamReader 打开同一个文件,并逐行读取其中的内容,并将每行内容输出到控制台。

    使用 StreamWriter 和 StreamReader 可以实现更灵活和复杂的文件操作,比如逐行读取、追加内容、指定编码等。同时,using 关键字确保在使用完成后正确地关闭文件流,释放资源。

    二进制文件的读写

    BinaryReader 和 BinaryWriter 类用于二进制文件的读写。

    BinaryReader 类

    BinaryReader 类用于从文件读取二进制数据。一个 BinaryReader 对象通过向它的构造函数传递 FileStream 对象而被创建。

    下表列出了 BinaryReader 类中一些常用的方法

    序号方法 & 描述
    1public override void Close()
    关闭 BinaryReader 对象和基础流。
    2public virtual int Read()
    从基础流中读取字符,并把流的当前位置往前移。
    3public virtual bool ReadBoolean()
    从当前流中读取一个布尔值,并把流的当前位置往前移一个字节。
    4public virtual byte ReadByte()
    从当前流中读取下一个字节,并把流的当前位置往前移一个字节。
    5public virtual byte[] ReadBytes( int count )
    从当前流中读取指定数目的字节到一个字节数组中,并把流的当前位置往前移指定数目的字节。
    6public virtual char ReadChar()
    从当前流中读取下一个字节,并把流的当前位置按照所使用的编码和从流中读取的指定的字符往前移。
    7public virtual char[] ReadChars( int count )
    从当前流中读取指定数目的字节,在一个字符数组中返回数组,并把流的当前位置按照所使用的编码和从流中读取的指定的字符往前移。
    8public virtual double ReadDouble()
    从当前流中读取一个 8 字节浮点值,并把流的当前位置往前移八个字节。
    9public virtual int ReadInt32()
    从当前流中读取一个 4 字节有符号整数,并把流的当前位置往前移四个字节。
    10public virtual string ReadString()
    从当前流中读取一个字符串。字符串以长度作为前缀,同时编码为一个七位的整数。

    如需查看完整的方法列表,请访问微软的 C# 文档

    BinaryWriter 类

    BinaryWriter 类用于向文件写入二进制数据。一个 BinaryWriter 对象通过向它的构造函数传递 FileStream 对象而被创建。

    下表列出了 BinaryWriter 类中一些常用的方法

    序号方法 & 描述
    1public override void Close()
    关闭 BinaryWriter 对象和基础流。
    2public virtual void Flush()
    清理当前编写器的所有缓冲区,使得所有缓冲数据写入基础设备。
    3public virtual long Seek( int offset, SeekOrigin origin )
    设置当前流内的位置。
    4public virtual void Write( bool value )
    把一个单字节的布尔值写入到当前流中,0 表示 false,1 表示 true。
    5public virtual void Write( byte value )
    把一个无符号字节写入到当前流中,并把流的位置往前移一个字节。
    6public virtual void Write( byte[] buffer )
    把一个字节数组写入到基础流中。
    7public virtual void Write( char ch )
    把一个 Unicode 字符写入到当前流中,并把流的当前位置按照所使用的编码和要写入到流中的指定的字符往前移。
    8public virtual void Write( char[] chars )
    把一个字符数组写入到当前流中,并把流的当前位置按照所使用的编码和要写入到流中的指定的字符往前移。
    9public virtual void Write( double value )
    把一个 8 字节浮点值写入到当前流中,并把流位置往前移八个字节。
    10public virtual void Write( int value )
    把一个 4 字节有符号整数写入到当前流中,并把流位置往前移四个字节。
    11public virtual void Write( string value )
    把一个以长度为前缀的字符串写入到 BinaryWriter 的当前编码的流中,并把流的当前位置按照所使用的编码和要写入到流中的指定的字符往前移。

    如需查看完整的方法列表,请访问微软的 C# 文档

    实例

    1. using System;
    2. using System.IO;
    3. class Program
    4. {
    5. static void Main()
    6. {
    7. string filePath = "D:/binaryfile.dat";
    8. // 使用 BinaryWriter 写入二进制文件
    9. using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create)))
    10. {
    11. double value1 = 3.14159;
    12. int value2 = 42;
    13. writer.Write(value1);
    14. writer.Write(value2);
    15. }
    16. // 使用 BinaryReader 读取二进制文件
    17. using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
    18. {
    19. double readValue1 = reader.ReadDouble();
    20. int readValue2 = reader.ReadInt32();
    21. Console.WriteLine("从二进制文件读取: " + readValue1 + ", " + readValue2);
    22. }
    23. }
    24. }

    在这个示例中,我们首先使用 BinaryWriter 打开文件并写入一个 double 值和一个 int 值。然后使用 BinaryReader 打开同一个文件,并按照写入的顺序读取相应类型的数据,并将其输出到控制台。

    使用 BinaryWriter 和 BinaryReader 可以实现对二进制文件的灵活读写操作。同时,using 关键字确保在使用完成后正确地关闭文件流,释放资源。

    Windows 文件系统的操作

    C# 允许您使用各种目录和文件相关的类来操作目录和文件,比如 DirectoryInfo 类和 FileInfo 类。

    DirectoryInfo 类

    DirectoryInfo 类派生自 FileSystemInfo 类。它提供了各种用于创建、移动、浏览目录和子目录的方法。该类不能被继承。

    下表列出了 DirectoryInfo 类中一些常用的属性

    序号属性 & 描述
    1Attributes
    获取当前文件或目录的属性。
    2CreationTime
    获取当前文件或目录的创建时间。
    3Exists
    获取一个表示目录是否存在的布尔值。
    4Extension
    获取表示文件存在的字符串。
    5FullName
    获取目录或文件的完整路径。
    6LastAccessTime
    获取当前文件或目录最后被访问的时间。
    7Name
    获取该 DirectoryInfo 实例的名称。

    下表列出了 DirectoryInfo 类中一些常用的方法

    序号方法 & 描述
    1public void Create()
    创建一个目录。
    2public DirectoryInfo CreateSubdirectory( string path )
    在指定的路径上创建子目录。指定的路径可以是相对于 DirectoryInfo 类的实例的路径。
    3public override void Delete()
    如果为空的,则删除该 DirectoryInfo。
    4public DirectoryInfo[] GetDirectories()
    返回当前目录的子目录。
    5public FileInfo[] GetFiles()
    从当前目录返回文件列表。

    如需查看完整的属性和方法列表,请访问微软的C# 文档

    FileInfo 类

    FileInfo 类派生自 FileSystemInfo 类。它提供了用于创建、复制、删除、移动、打开文件的属性和方法,且有助于 FileStream 对象的创建。该类不能被继承。

    下表列出了 FileInfo 类中一些常用的属性

    序号属性 & 描述
    1Attributes
    获取当前文件的属性。
    2CreationTime
    获取当前文件的创建时间。
    3Directory
    获取文件所属目录的一个实例。
    4Exists
    获取一个表示文件是否存在的布尔值。
    5Extension
    获取表示文件存在的字符串。
    6FullName
    获取文件的完整路径。
    7LastAccessTime
    获取当前文件最后被访问的时间。
    8LastWriteTime
    获取文件最后被写入的时间。
    9Length
    获取当前文件的大小,以字节为单位。
    10Name
    获取文件的名称。

    下表列出了 FileInfo 类中一些常用的方法

    序号方法 & 描述
    1public StreamWriter AppendText()
    创建一个 StreamWriter,追加文本到由 FileInfo 的实例表示的文件中。
    2public FileStream Create()
    创建一个文件。
    3public override void Delete()
    永久删除一个文件。
    4public void MoveTo( string destFileName )
    移动一个指定的文件到一个新的位置,提供选项来指定新的文件名。
    5public FileStream Open( FileMode mode )
    以指定的模式打开一个文件。
    6public FileStream Open( FileMode mode, FileAccess access )
    以指定的模式,使用 read、write 或 read/write 访问,来打开一个文件。
    7public FileStream Open( FileMode mode, FileAccess access, FileShare share )
    以指定的模式,使用 read、write 或 read/write 访问,以及指定的分享选项,来打开一个文件。
    8public FileStream OpenRead()
    创建一个只读的 FileStream。
    9public FileStream OpenWrite()
    创建一个只写的 FileStream。

    如需查看完整的属性和方法列表,请访问微软的 C# 文档

    实例

    1. using System;
    2. using System.IO;
    3. class Program
    4. {
    5. static void Main()
    6. {
    7. string directoryPath = @"D:/C#";
    8. // 使用 DirectoryInfo 获取目录信息
    9. DirectoryInfo directoryInfo = new DirectoryInfo(directoryPath);
    10. if (directoryInfo.Exists)
    11. {
    12. Console.WriteLine("目录名称: " + directoryInfo.Name);
    13. Console.WriteLine("创建时间: " + directoryInfo.CreationTime);
    14. // 使用 FileInfo 遍历文件信息
    15. FileInfo[] files = directoryInfo.GetFiles();
    16. Console.WriteLine("文件数: " + files.Length);
    17. foreach (FileInfo file in files)
    18. {
    19. Console.WriteLine("文件名: " + file.Name);
    20. Console.WriteLine("文件大小: " + file.Length + " 字节");
    21. Console.WriteLine("上次访问时间: " + file.LastAccessTime);
    22. }
    23. }
    24. else
    25. {
    26. Console.WriteLine("目录不存在。");
    27. }
    28. }
    29. }

    在这个示例中,我们首先使用 DirectoryInfo 类获取指定目录的信息,包括目录名和创建时间。然后使用 GetFiles 方法获取目录中的所有文件信息,并遍历输出每个文件的名称、大小和最后访问时间等信息。

    通过使用 DirectoryInfo 类和 FileInfo 类,可以方便地获取目录和文件的各种信息,并对其进行操作。

  • 相关阅读:
    Unity --- 给游戏物体做标记 以及 快捷键补充
    SpringMVC使用AOP监听方法推送数据
    py20_(终于第 21 天)初识 Python 3 GUI 编程 tk 窗口之文本图像控件及面向对象 GUI 编程!
    JWT -- Json Web token
    【斗罗大陆2】动画新增12集备案,冰碧帝皇蝎形象被吐槽遭狂喷!
    springboot2 shardingjdbc4.x 分表
    docker安装与搭建sqli靶机
    怎么修改jupyter lab 的工作路径而不是直接再桌面路径打开
    黑白影片智能上色,复原历史重现经典
    《算法竞赛进阶指南》差分约束 区间
  • 原文地址:https://blog.csdn.net/m0_74293254/article/details/134474128