C#文件操作(二)

一、前言

文章的续作前文是:

C#文件操作(一)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/135117922?spm=1001.2014.3001.5501

二、流

        流是序列化设备的抽象表示序列化设备可以线性方式储存数据并可按照同样的方式访问一次访问一个字节此设备可以是磁盘文件网络通道内存位置或其他支持以现行方式读取的对象把设备变成抽象的就可以隐藏流的底层目标和元 (书上对于流的介绍)

1 FileStream 

        FileStream类提供了很多对文件读写的方法,需要注意FileStream是对字节和字节数组操作而StreamWriter和StreamRead则是对字符数据操作,这是二者不同的地方。主要是对文件的读写操作。

1.1读取文件

举个例子:

 //储存数据的字节数组
 byte[] bytes = new byte[1024];
 System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", System.IO.FileMode.OpenOrCreate);
 //将指针移到文件的开始位置的第七个字节处
 fileStream.Seek(0, System.IO.SeekOrigin.Begin);
 //读取方法 Read  参数第一个:读取到的数据写入的字节数组  第二个:在字节数组中的第几个字节处放置读取的数据 
 //第三个:指定读取的字节数
 //注意:如果要更改读取放置的位置那么字节长度也要相应减少 不然会报错
 fileStream.Read(bytes,10, bytes.Length-10);
 //将读取的字节数组通过 Encoding转码得到一个字符串 输出出来
 System.Console.WriteLine(System.Text.Encoding.UTF8.GetString(bytes));
 System.Console.ReadKey();

提示:1 FileStream有多个重载版本其中使用最多的是两个参数或三个参数的构造器。 

System.IO.FileStream fileStream2= new System.IO.FileStream
("Log.txt", System.IO.FileMode.OpenOrCreate,System.IO.FileAccess.Read);

注意:

        其中FileMode指定了如何打开或创建文件,FileAccess指定了流的作用 ,都是枚举类型,其中如果FileAccess 指定了流的作用是读取文件那么如果你实际是写入文件那么将会抛出异常。

1.2 写入文件

 举个例子:

  try
  {
      //将要写入的信息转换为字节数组
      byte[] bytes = System.Text.Encoding.UTF8.GetBytes("写入文件的信息");
      //指定对文件进行OpenOrCreate 操作 流是进行写入操作
      System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
      //将指针移动指文件结束位置 的第0个位置写入
      fileStream.Seek(0, System.IO.SeekOrigin.End);
      //写入
      fileStream.Write(bytes, 0, bytes.Length);

  }
  catch (System.Exception ex)
  {

      System.Console.WriteLine(ex.Message);
      System.Console.ReadKey();
  }

注意:

        文件类似的操作是很容易由各种原因引发异常,我们在对文件操作时应当使用Try语句。对异常进行处理和预防。 

2 StreamWriter

        StreamWriter前面提到了是对字符数据进行操作。如果不需要将指针指向文件何处位置那么使用此类是很简单的。

2.1 创建StreamWriter 对象

第一种:

 FileStream fileStream = new FileStream("Log.txt", FileMode.Open, FileAccess.Read);
 StreamWriter writer = new StreamWriter(fileStream);

提示:可以在已经有了FileStream对象时可以这么创建 

第二种:

StreamWriter writer = new StreamWriter("Log.txt",false);

示例解释:

        两个参数,第二个参数是设置是否对文件进行追加,True则是在文件结束处追加在后面,False则是重头写入,或者新建一个文件写入。 

2.2 写入文件

举个例子:

 System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", FileMode.OpenOrCreate);
 System.IO.StreamWriter writer = new System.IO.StreamWriter(fileStream);
 writer.WriteLine("信息1");
 writer.Write("信息2");
 writer.Write("信息3");
 writer.Write("信息4");
 writer.Write("信息5");
 writer.Close();

效果:

3 StreamRead

        StreamRead前面也提到了也是对字符数据进行操作。它一样有两种创建的方式和StreamWriter类似。

3.1 读取文件

举个例子:

   System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", System.IO.FileMode.OpenOrCreate);
   System.IO.StreamReader writer = new System.IO.StreamReader(fileStream);
   int charcode=default;
   while (charcode!=-1)
   {
       Console.Write(Convert.ToChar(charcode));
       charcode = writer.Read();
   }
   writer.Close();
   //还有读取方法writer.ReadLine(); 与 writer.ReadToEnd();
   Console.ReadKey();

 提示:除了当前使用的方法还有ReadLine 和ReadToEnd方法。效果与直译效果一样。

4 异步文件访问

         当我们读取较大的文件时我们需要花费一点时间但我们不能让我们的主线程卡在读取从而无法正常与用户交互。其中我们上面使用的方法带有Async修饰的即代表异步读取,不会堵住我们的线程。

5 读写压缩文件

两个压缩流类举个例子:

封装的保存方法

 static void SaveCompressedFile(string filename, string data)
 {
     FileStream fileStream =new FileStream(filename, FileMode.Create, FileAccess.Write);
     GZipStream compressionStream =  new GZipStream(fileStream, CompressionMode.Compress);
     StreamWriter writer = new StreamWriter(compressionStream);
     writer.Write(data);
     writer.Close();
 }

封装的读取方法

 static string LoadCompressedFile(string filename)
 {
     FileStream fileStream =
        new FileStream(filename, FileMode.Open, FileAccess.Read);
     GZipStream compressionStream =
        new GZipStream(fileStream, CompressionMode.Decompress);
     StreamReader reader = new StreamReader(compressionStream);
     string data = reader.ReadToEnd();
     reader.Close();
     return data;
 }

使用方式:

  static void Main(string[] args)
  {
      SaveCompressedFile("log.txt", "写入的数据");
      var str = LoadCompressedFile("log.txt");
      Console.WriteLine(str);
      Console.ReadKey();
  }

        需要注意当前的保存文件是对数据进行了压缩不是改为压缩包。书上提到的压缩比例是80:1。我们只需要了解如何使用就可以了

三、监控文件

        FileSystemWatcher类有一个公共无参的构造函数创建该对象实例后可以通过属性 EnableRaisingEvents为true的时候则代表开始监控 Path属性代表监控文件的路径 Filter代表监控哪种文件格式 *.*代表所有文件。NotifyFilter属性代表要监控的类型 我们可以使用二元OR运算符 来合并这些枚举值。

举个例子:

 watcher.NotifyFilter = NotifyFilters.LastWrite |
    NotifyFilters.FileName | NotifyFilters.Size;

注意: watcher 是FileSystemWatcher的实例

可以给当前类型创建多个处理事件。

 watcher.Deleted += (s, e) => { };
 watcher.Renamed += (s, e) =>{ };
 watcher.Changed += (s, e) => { };
 watcher.Created += (s, e) => { };

示例解释:分别创建了删除触发的世界更改触发的事件新建触发的事件重命名触发的事件  

本章学习完结 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【QT】QGraphicsView和QGraphicsItem坐标转换

坐标转换 QGraphicsItem和QGraphicsView之间的坐标转换需要通过QGraphicsScene进行转换 QGraphicsView::mapToScene() - 视图 -> 场景QGraphicsView::mapFromScene() - 场景 -> 视图QGraphicsItem::mapToScene() - 图元 -> 场景QGraphicsItem::mapFromScene() - 场景 …

Java异常类分类,所有子类的父类是什么

1.异常的层次机构: 所有异常的父类是Throwable,它有两个子类,分别是Error和Exception。 2.Error: 表示系统错误,通常不能处理和恢复。比如StackOverFlowError或者OutOfMemoryError,出了问题只能结束程序…

【项目问题解决】% sql注入问题

目录 【项目问题解决】% sql注入问题 1.问题描述2.问题原因3.解决思路4.解决方案1.前端限制传入特殊字符2.后端拦截特殊字符-正则表达式3.后端拦截特殊字符-拦截器 5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 在处理接口入参的一些sql注入问题,虽然通过M…

【matlab】绘制竖状双组渐变柱状图

【matlab】绘制竖状双组渐变柱状图

【krita】实时绘画 入门到精通 海报+电商+装修+人物

安装插件 首先打开comfyUI,再打开krita,出现问题提示, 打开 cd custom_nodes 输入命令 安装控件 git clone https://github.com/Acly/comfyui-tooling-nodes.git krita基础设置 设置模型 设置lora (可设置lora强度 增加更多…

使用yarn安装electron时手动选择版本

访问1Password或者其他可以提供随机字符的网站,获取随机密码运行安装命令 操作要点,必须触发Couldnt find any versions for "electron" that matches "*"才算成功 将复制的随机密码粘贴到后面 例如:yarn add --dev elec…

智能优化算法应用:基于堆优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于堆优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于堆优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.堆优化算法4.实验参数设定5.算法结果6.参考文…

Python自动化测试系列[v1.0.0][常见页面操作处理]

[智能等待] # 用于实现智能等待页面元素的出现 # encoding utf-8 """ __title__ __author__ davieyang __mtime__ 2018/4/21 """ from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait …

制作系统盘

老毛桃(LaoMaoTao) 制作启动盘 第一步.进入官方网站下载我们的老毛桃 下载老毛桃U盘制作工具后,双击打开老毛桃的运行程序。 打开老毛桃U盘制作工具,插入需要制作的U盘(如图所示U盘winpe系统制作界面)。…

ansible在ubuntu下的安装和使用

ansible在ubuntu下的安装和使用 本文目录 ansible在ubuntu下的安装和使用安装和配置虚拟机配置安装和验证 简单使用创建 ansible cfg 和 inventory 文件创建剧本并执行使用 ansible vault 加密 安装和配置 中文文档:http://www.ansible.com.cn/docs/intro_installa…

玩具乐器企业网站建设的作用是什么

玩具乐器的市场需求度非常高,对玩具乐器厂家而言,经销批量卖货是主要的,然而却并不容易,玩具乐器厂商品牌宣传及拓客转化方面面临痛点: 1、线上无平台、拓客难 玩具乐器商家缺少品牌宣传方式,线下难以拓展…

vlan的通信(hcia)

有两种情况 第一种 vlanif的接口 VLANIF接口:VLANIF接口是一种三层的逻辑接口。在VLANIF接口上配置P地址 后,没备会在MAC地址表中添加VLANIF接口的MAC地址VD表项,并且为表项的 三层转发标志位置位。当报文的目的MAC地址匹配该表项后&a…

Qt之QWidget 自定义倒计时器

简述 Qt提供的带进度显示的只有一个QProgresBar,这个控件要么是加载进度从0~100%,要么是持续的两边滚动;而我想要是倒计时的效果,所以QProgresBar并不满足要求,而Qt重写控件相对于MFC来说简直是轻而易举,所以就整了两种不同的倒计时控件; 效果 代码 QPushButton的绘制部…

TortoiseGit通过SSH连接配置,生成SSH密钥方法

生成SSH密钥: Win环境下命令(git ssh key是可以自定义命名的): ssh-keygen -t ed25519 -C "git ssh key" && start "" "C:\Windows\notepad.exe" "C:\Users\%username%\.ssh\id_ed25519.pub" 打开cm…

计算机毕业设计 基于SpringBoot的大学生平时成绩量化管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

mac电脑m1 arm架构安装虚拟机教程

1、准备一台虚拟机,安装CentOS7 常用的虚拟化软件有两种: VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机,下载地址:Downloads – Oracle VM VirtualBox 001 点击安装 002 报错:he installer has detected an…

13、Qt:用QProcess类启动外部程序:复杂使用

一、说明 简单使用:在一个函数中,使用QProcess类的临时对象调用可执行文件exe,只有这个exe执行完了,这个函数才往下执行,一次性打印出exe所有输出信息;复杂使用:创建QProcess类的全局对象&…

在MacOS上Qt配置OpenCV并进行测试

一.Qt环境准备 上一篇博客我讲了如何下载配置OpenCV库,但是在Qt5.15.2使用OpenCV库时,出现了一个问题就是我下载的Qt5.15.2是x86架构的,不能对OpenCV库进行链接,而OpenCV库是arm架构的 直接使用Qt5.15.2编译链接OpenCV库链接头文件…

合并两个有序链表算法(leetcode第21题)

题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:输入:l1 [], l2 [] 输…

UE4 UE5 一直面向屏幕

一直面相屏幕,方法很简单 新建一个蓝图,如下添加组件: 蓝图如下: Rotation Actor :需要跟随镜头旋转的物体 Update:一个timeline(替代event tick 只是为了循环) Timeline&#xff…