C#中使用I/O文件流

简介: 流,即是二进制数值,文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。在 .NET 中,System.IO命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串行端口启用通信的类型。命名空间:System.IO程序集:System.Runtime.dll。

 流,即是二进制数值,文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。 在 .NET 中,System.IO 命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。 这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串行端口启用通信的类型。

    • 命名空间:System.IO
      • 程序集:System.Runtime.dll

      File类

      AppendAllLines

      //追加行方法
      //目录不存在时会报错,目录存在文件不存在时会自动生成
      File.AppendAllLines(@"D:\val\log.txt",new List<string>{$"第一行{DateTime.Now}",$"第二行{DateTime.Now}"},Encoding.UTF8);

      image.gif

      执行了两次,可以看见使用AppendAllLines会自动换行

      image.gif

      其中Encoding.UTF8是指编码格式,如果是utf-8可以默认不写,换成Encoding.ASCII再执行一次,因为记事本是utf-8的编码格式,所以打开出现了乱码

      image.gif

      AppendAllText

      与AppendAllLines不同的是使用AppendAllText时不会进行换行

      File.AppendAllText(@"D:\val\log.txt",$"追加文本内容1{DateTime.Now}");
      File.AppendAllText(@"D:\val\log.txt",$"追加文本内容2{DateTime.Now}");

      image.gif

      image.gif

      AppendText

      AppendText是流写入,使用流写入要注意完成功能后需要释放资源

      var streamWriter = File.AppendText(@"D:\val\log.txt");
      streamWriter.WriteLine("通过streamWriter对象写入");
      streamWriter.Flush();//刷新缓冲区
      streamWriter.Close();//关闭流

      image.gif

      这里补充一下close和Using的区别

      在C#中,using和close都是用于释放资源的方法,但是它们之间有一些区别。using语句会自动调用Dispose方法来释放资源,而close方法只是关闭当前的连接或者资源,只要其后没有dispose,还可以继续open连接,即close并未释放资源,只做了关闭

      使用范围:

      using是用于定义在范围之内的对象,使得该对象在使用完毕后自动被销毁并释放资源。using语句块结束时,编译器会自动调用对象的Dispose()方法,这是因为该对象必须实现IDisposable接口,这样才能使用using语句。

      close则是用于流(如文件、网络、数据库等)的关闭操作,这是因为流在使用完毕之后需要立即被关闭以释放底层资源。

      生命周期:

      using提供了一个便利的方式来确保对象的Dispose()方法及时被调用来释放资源,可以有效地管理对象生命周期。而close则是一种操作,不进行调用也不会有内存泄漏的问题。

      image.gif

      Copy复制

      将一个文件复制到指定路径

      //原文件必须存在,不允许覆盖同名文件
      File.Copy(@"D:\val\log.txt",@"D:\val\log2.txt");
      //第三个参数为true表示允许覆盖同名文件,默认为false
      File.Copy(@"D:\val\log.txt",@"D:\val\log2.txt",true);

      image.gif

      Create创建流

      //创建一个文件流,再使用流写入
      using var fileStream = File.Create(@"D:\val\log.txt");
      using StreamWriter writer = new StreamWriter(fileStream);
      writer.WriteLine("通过streamWriter对象写入");

      image.gif

      使用这种方式需要释放资源

      Delete删除

      File.Delete(@"D:\val\log.txt");

      image.gif

      Move移动

      移动就相当于我们常用的剪切,和复制一样第三个参数为true则可覆盖同名文件

      File.Move(@"D:\val\log.txt", @"D:\val\log2.txt", true);

      image.gif

      Exists判断是否存在

      if (File.Exists(@"D:\val\log.txt"))
      {
          Console.WriteLine("存在");
      }
      else
      {
          Console.WriteLine("不存在");
      }

      image.gif

      Open打开

      File的Create和Open方法都可以用于创建或打开文件,但是它们有着一些区别,具体如下:

      文件是否存在

      如果文件不存在,则Create方法将创建一个新的文件,而Open方法将引发一个异常。

      打开方式

      Create方法使用FileMode枚举值来指定打开方式,例如CreateNew、Create、OpenOrCreate等,而Open方法则使用FileMode枚举值来指定打开方式,例如Open、OpenOrCreate、Truncate等。

      文件句柄

      Create方法将返回一个FileStream对象,该对象表示新创建的文件,可以使用该对象对文件进行写入操作。Open方法将返回一个FileStream对象,该对象表示已经存在的文件,可以使用该对象对文件进行读取和写入操作。

      是否清空文件

      Create方法在创建新文件时清除其内容,而Open方法仅仅将文件指针移到文件的开头,文件的内容仍然存在,当需要清除文件内容时需要自己实现。

      总体来说,Create方法用于在指定路径创建一个新的文件,而Open方法用于打开一个已经存在的文件,并返回FileStream对象来读取和写入文件内容。

      using var fileStream = File.Open(@"D:\val\log.txt", FileMode.Open);
      using StreamWriter writer = new StreamWriter(fileStream);
      writer.WriteLine($"OpenTxt----");

      image.gif

      image.gif

      执行多次后打开txt,如图,使用open打开的文件,进行写的时候会覆盖原有的文件内容

      如果使用File.Open方法打开文件但没有指定访问方式,则默认以读写方式(FileAccess.ReadWrite)打开文件

      //只写
      File.Open(@"D:\val\log.txt", FileMode.Open,FileAccess.Write));
      //只读
      File.Open(@"D:\val\log.txt", FileMode.Open,FileAccess.Read));

      image.gif

      OpenRead只读

      File.OpenRead是File类的静态方法,该方法只需要传入文件路径即可返回一个只读的FileStream对象进行读取操作;如果只需要对文件进行简单的只读操作,可以使用File.OpenRead方法,这样简单明了。而如果需要更加灵活地进行文件读写操作,则需要使用File.Open方法,并根据实际需求选择适当的访问权限以及共享方式。

      using var fileStream = File.OpenRead(@"D:\val\log.txt");

      image.gif

      OpenWrite只写

      using var fileStream = File.OpenWrite(@"D:\val\log.txt");

      image.gif

      ReadAllLines读取并关闭

      var readAllLines = File.ReadAllLines(@"D:\val\log.txt",Encoding.UTF8);
      Console.WriteLine(readAllLines[0]);
      Console.WriteLine(readAllLines[1]);

      image.gif

      image.gif

      FileInfo类

        • FileInfo 类表示一个文件的元数据,包括文件名、文件路径、文件大小、创建时间、修改时间等等。使用 FileInfo 类,你可以获取或设置这些文件属性,并执行一些简单的操作,比如把文件拷贝到指定目录、移动文件到别的位置、重命名文件等等。
          • File 类提供了一些静态方法来操作文件本身,比如读取文件内容、写入文件内容、删除文件等等。使用 File 类,你可以执行一些基本的文件操作,而无需使用文件对象或元数据,比如复制、移动或重命名文件。

          如果你只需要获取或修改文件的元数据,使用 FileInfo 类更好。而如果你需要执行一些基本的文件操作,使用 File 类更合适。

          如果对同一个文件进行多次操作,使用FileInfo会更加高效,因为FileInfo不会做安全检查

          var fileInfo = new FileInfo(@"D:\val\log.txt");

          image.gif

          image.gif

          可以看出FileInfo类的方法比File类要多,并且使用FileInfo不需要使用 using 语句块自动关闭和释放这些类的资源,因为 FileInfo 类不会直接打开或读取文件,只是表示文件的元数据信息。如果你需要访问文件内容,你需要使用其他类,如 FileStreamStreamReader。👇

          var fileInfo = new FileInfo(@"D:\val\log.txt");
          using var fileStream = fileInfo.OpenRead();
          var streamReader = new StreamReader(fileStream);
          Console.WriteLine(streamReader.ReadLine());

          image.gif

          DirectoryInfo类(操作目录)

          DirectoryInfo用于创建移动和遍历目录

          创建目录

          var directoryInfo = new DirectoryInfo(@"D:\val");

          image.gif

          打开D盘该路径下以及有val文件夹了,在里面创建点东西。

          image.gif

          //获取路径下的子文件夹,遍历一下
          var enumerateDirectories = directoryInfo.EnumerateDirectories();
          foreach (var VARIABLE in enumerateDirectories)
          {
              Console.WriteLine(VARIABLE.FullName);
          }

          image.gif

          image.gif

          给EnumerateDirectories方法增加一点参数,

          var enumerateDirectories = directoryInfo.EnumerateDirectories("*",SearchOption.AllDirectories);

          image.gif

          获取到了路径下的所有文件夹

          image.gif

          获取文件

          var fileInfo = new DirectoryInfo(@"D:\val");
          var fileInfos = fileInfo.GetFiles("*.*", SearchOption.AllDirectories);

          image.gif

          image.gif


          目录
          相关文章
          |
          2月前
          |
          安全 C# 开发者
          C# 一分钟浅谈:文件操作与文件流详解
          【9月更文挑战第4天】在日常开发中,文件的读写是基本而重要的任务。C# 通过 `System.IO` 命名空间提供了多种工具,如 `FileStream`、`StreamReader` 和 `StreamWriter` 等,用于处理文件和流。本文从基础概念入手,详细介绍了这些类的使用方法,并讨论了常见错误及其避免策略,包括文件不存在、权限问题和文件被占用等。通过示例代码,展示了如何创建、读取文件以及进行二进制数据操作,并强调了异常处理和性能优化的重要性。掌握这些技巧对于提升编程能力至关重要。
          158 2
          C#编程-117:文件流FileStream类
          C#编程-117:文件流FileStream类
          133 0
          C#编程-117:文件流FileStream类
          |
          关系型数据库 C# 分布式数据库
          C# 文件流压缩解压
          /// &lt;summary&gt; /// 文件流压缩解压 /// &lt;/summary&gt; public class ZipHelper { public static int BEST_COMPRESSION = 9; public static int BEST_SPEED = 1; publi
          3003 0
          C# 文件流相关操作
          二进制转换成图片: MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Image img = Image.FromStream(ms); ms.
          847 0
          |
          移动开发 C# 设计模式
          WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法
          原文:WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法首先多谢朋友们的捧场; 今天给大家带来一个操作WebBrowser的一些高级方法,我专门写了一个html编辑器的实现代码,有需要的朋友可以自己扩充; 功能实现是直接写流到WebBrowser内不通过临时文件,并且支持对WebBrowser的一些高级控制(其实script可以达到的均可达到,想知道怎么搞的可以阅读代码)。
          1063 0