当前位置: 首页 > news >正文

C#-快速剖析文件和流,并使用

目录

一、概述

二、文件系统

1、检查驱动器信息

2、Path

3、文件和文件夹

三、流

1、FileStream

2、StreamWriter与StreamReader

3、BinaryWriter与BinaryReader


 

一、概述

文件,具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合;

,提供一种向后备存储写入字节和从后备存储读取字节的方式; 

读写文件和目录时可使用简单的API,也可使用先进的API提供更多的功能;

使用,可以压缩数据,并且利用内存映射的文件和管道在不同的任务间共享数据;

 


二、文件系统

System.IO名称空间包含一些简单的API,其中最重要的类用于浏览文件系统和执行操作,如移动、复制和删除文件:

  • FileSystemInfo-这是表示任何文件系统对象(如FileInfo和DirectoryInfo)的基类;
  • FileInfo和File-表示文件系统上的文件;
  • DirectoryInfo和Directory-表示文件系统上的文件夹;
  • Path-包含的静态成员可用于处理路径名;
  • DriveInfo-它的属性和方法提供了指定驱动器的信息;

1、检查驱动器信息

使用DriveInfo的GetDrives()静态方法获取DriveInfo对象数组,再访问每个驱动器信息;

var driveInfos = DriveInfo.GetDrives();
foreach (var driveInfo in driveInfos) Console.WriteLine($"Name:{driveInfo.Name}  totalSize={driveInfo.TotalSize}  freeSpace={driveInfo.TotalFreeSpace}");

 

2、Path

最常用的方法:

  • Path.Combine(),可把任意个字符串参数组合成完整的路径返回;
  • Path.GetFileName(),获取带扩展名的文件名;
  • Path.GetFileNameWithoutExtension(),获取不带扩展的文件名;
  • Path.GetExtension(),获取扩展名
  • Path.GetDirectoryName(),获取文件夹路径名;
  • Path.GetFullPath(),获取包含文件名及扩展名的全路径名;
  • Path.GetTempFileName(),返回一个临时文件夹路径;
  • Path.GetRandomFileName(),返回一个随机文件名;
  • Path.ChangeExtension(),修改指定文件的扩展名;
string path= Path.Combine(Directory.GetCurrentDirectory(),"test.txt");
var path1=Path.GetFileName(path);
var path2=Path.GetFileNameWithoutExtension(path);
var path3=Path.GetExtension(path);
var path4=Path.GetDirectoryName(path);
var path5=Path.GetFullPath(path);
Console.WriteLine($"文件名:{path1}  无扩展文件名{path2}  扩展:{path3}\n文件夹路径:{path4}\n全路径名:{path5}");

0e7b658c2f1f438aa0e31a64290240fb.png

Environment.GetFolderPath(),获取特殊文件夹的路径:

var foldPath=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Console.WriteLine(foldPath);//C:\Users\Administrator\Documents

 

3、文件和文件夹

 File、Directory定义静态方法,FileInfo、DirectoryInfo提供实例方法,对于大多文件属性只读不可修改,但可设置创建时间和最后一次访问时间;

File常用方法: 

  • File.WriteAllText(),创建并写入文件;
  • File.WriteAllLines(),创建并写入所有行;
  • File.ReadAllBytes(),读取文件所有内容;
  • File.ReadAllLines(),读取文件所有行;
  • File.AppendAllText(),追加的方式写入所有内容;
  • File.AppendAllLines(),追加的方式写入所有行;
  • File.Copy(),复制文件;
  • File.Exists(),判断文件是否存在;
  • File.Create(),创建指定路径文件;
  • File.Open(),打开指定路径上的FileStream(文件流);
  • File.OpenWrite(),打开或创建一个文件用于写,返回可写的流(流位置在开始);
  • File.OpenRead(),打开存在的文件用于读,返回可读的流;

Directory常用方法: 

  • Directory.Exists(),判断文件夹是否存在;
  • Directory.GetDirectories(),获取指定目录中所有子目录的名称;
  • Directory.GetDirectoryRoot(),返回指定路径的卷信息、根信息或二者同时返回;
  • Directory.GetCurrentDirectory(),获取当前工作目录;
  • Directory.GetFiles(),获取指定目录的所有文件名称;
  • Directory.GetFileSystemEntries(),获取所有文件和子目录名称;
  • Directory.GetParent(),检索指定路径的父目录;

 FileInfo常用属性(方法大多与File静态类相同)

  • Directory:获取父目录实例;
  • DirectoryName:获取表示目录完整路径的字符串;
  • FullName:获取目录或文件的完整目录;
  • Name:获取文件名;
  • IsReadOnly,获取和设置文件只读;
  • Extension,获取文件扩展名;
  • CreationTime,获取和设置文件创建时间;
  • LastAccessTime,获取和设置文件最后访问时间;
  • Attributes,获取和设置文件的特性;
  • Length,获取文件大小,以字节为单位;

DirectoryInfo常用属性(方法大多与Directory静态类相同)

  • Extension:获取表示文件扩展名部分的字符串;
  • Parent:获取指定子目录的父目录;
  • Root:获取路径的根部分;

 


三、流

流是一个用于传输数据的对象,数据可以向两个方向传输,如果数据从外部源传输到程序中,为读取流,如果数据从程序传输到外部源中,为写入流

外部源常常是一个文件,但也不完全是文件,外部数据源可以是 :文件流,网络流、内存流或任意数据源;

Stream类,是构成所有其它流的抽象类;

一些流可以链接起来,比如DeflateStream可压缩数据(该流可写入FileStream、MemoryStream或NetworkStream),CryptoStream可以加密数据,可以链接DeflateStream和CryptoStream,再写入FileStream;

1、FileStream

文件流,在磁盘或网络路径上指向文件的流;

①FileStream常用构造器

  • 参数1,指定文件路径;
  • 参数2,FileMode枚举(Append追加或新建,Create新建或改写,Open打开文件,CreateNew新建,OpenOrCreate,打开文件或新建,Truncate打开并清空);
  • 参数3,FileAccess枚举,读、写、读与写;
  • 参数4,FileShare枚举,Delete、None、Read、Write。。。;

②常用属性:

  • CanRead、CanSeek、CanTimeout、CanWrite
  • IsAsync,是异步还是同步打开文件流;
  • Length,获取用字节表示的流长度;
  • Name、Position、ReadTimeout、WriteTimeout

③常用方法:

  • BeginRead()、BeginWrite(),异步读、写操作;
  • Close()、Read()、ReadByte()、WriteByte();
  • Write(),写入一个字节数组或Span类型(不用传开始位置和大小);
  • EndRead(),等待挂起的异步读取完成;
  • EndWrite(),结束异步写入,在I/O操作完成前一直阻止;
  • (Unlock)Lock(),允许读取访问的同时防止其它进程更改FileStream;
  • Seek(),设置该流当前位置;
  • SetLength(),设置读流的长度;
  • CopyTo(),复制流;

 


2、StreamWriter与StreamReader

由于直接读写流不是那么容易,所以一般使用读写器和写入器;

基类分别为TextWriter和TextReader(也是StringWriter和StringReader基类);

文本文件的写入、读取流,一般以一个Stream类型对象构造(可指定编码);

①StreamWriter

常用属性:Encoding、Formatprovider、NewLine、AutoFlush

常用方法(部分方法提供异步):

  • Close(),关闭当前流对象;
  • Write(),写字符串到流;
  • WriteLine(),写一行字符串到流;
  • Dispose(),释放当前流对象资源;
  • Flush(),刷新(清空)当前流缓存区;

②StreamReader

常用属性:EndOfStream,可检查文件的末尾

常用方法(部分方法提供异步):

  • Close()、Read()、ReadLine(),同上
  • ReadBlock(),读取最大count的字符并从index开始写入buffer;
  • ReadToEnd(),将整个流(从当前位置到结尾)作为字符串读取;

 


3、BinaryWriter与BinaryReader

专门用于读写二进制格式的流产品API ;

以Stream类型对象构造;

①BinaryWriter,以二进制形式将基元类型写入流

常用方法:

  • Close(),关闭流;
  • Write(),写字节数组(提供string、int等多种重载)到流;
  • Seek(),写入位置标识偏移到指定位置;

②BinaryReader,用特定编码将基元数据类型读作二进制值

常用方法:

  • Close(),关闭流;
  • ReadByte(),读取一个字节返回
  • ReadBytes(),读取指定count字节返回
  • Read(),从index开始读取count个字节到buffer中;
  • ReadBoolean(),ReadChar(),ReadInt32(),ReadString()。。。读取指定类型返回;      

 

 

 

相关文章:

C#-快速剖析文件和流,并使用

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件,具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合; …...

【Linux】如何在Ubuntu 20.04上安装PostgreSQL

介绍 PostgreSQL或Postgres是一个关系数据库管理系统,提供SQL查询语言的实现。它符合标准,具有许多高级功能,如可靠的事务和无读锁的并发性。 本指南演示了如何在Ubuntu 20.04服务器上快速启动和运行Postgres,从安装PostgreSQL到…...

IT程序员面试题目汇总及答案-计算机面试

程序员面试题目汇总及答案-计算机面试 问题1:请你描述一下你在过去的工作中遇到的一个技术难题,你是如何解决的? 答案1:在我之前的工作中,我遇到了一个涉及大数据处理的问题。由于数据量巨大,传统的处理方法无法在规定的时间内完成。我最后采用了一种分布式计算的方法,…...

【Flink on k8s】- 5 - 简要介绍 Flink

目录 1、了解流计算框架 1.1 分代 1.2 流计算框架对比 2、Flink 的应用场景 2.1 Data anal...

物联网安全芯片ACL16 采用 32 位内核,片内集成多种安全密码模块 且低成本、低功耗

ACL16 芯片是研制的一款32 位的安全芯片,专门面向低成本、低功耗的应用领域, 特别针对各类 USB KEY 和安全 SE 等市场提供完善而有竞争力的解决方案。芯片采用 32 位内核,片内集成多种安全密码模块,包括SM1、 SM2、SM3、 SM4 算法…...

【Linux top命令】

文章目录 深入了解Linux top命令:实时监控系统性能1. 什么是top命令?2. 使用top命令3. top命令交互操作 深入了解Linux top命令:实时监控系统性能 1. 什么是top命令? top命令是一个用于实时监控系统性能的文本界面工具。它显示当…...

深入理解 Promise:前端异步编程的核心概念

深入理解 Promise:前端异步编程的核心概念 本文将帮助您深入理解 Promise,这是前端异步编程的核心概念。通过详细介绍 Promise 的工作原理、常见用法和实际示例,您将学会如何优雅地处理异步操作,并解决回调地狱问题。 异步编程和…...

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…...

springboot(ssm寝室小卖部系统 宿舍小商店网站Java(codeLW)

springboot(ssm寝室小卖部系统 宿舍小商店网站Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&#x…...

什么是web组态?一文读懂web组态

随着工业4.0的到来,物联网、大数据、人工智能等技术的融合应用,使得工业领域正在经历一场深刻的变革。在这个过程中,web组态技术以其独特的优势,正在逐渐受到越来越多企业的关注和认可。那么,什么是web组态&#xff1f…...

华为OD机试真题-智能成绩表-2023年OD统一考试(C卷)

题目描述: 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗? 输入描述: 第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10 第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符…...

YOLOv5独家原创改进:SPPF自研创新 | 可变形大核注意力(D-LKA Attention),大卷积核提升不同特征感受野的注意力机制

💡💡💡本文自研创新改进: 可变形大核注意力(D-LKA Attention)高效结合SPPF进行二次创新,大卷积核提升不同特征感受野的注意力机制。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合p…...

算法:进制之前的转换

1. X进制转换成十进制-V1&#xff1a; /*** 笨办法&#xff0c;从左往右开始* Tips&#xff1a;只支持正数** param num* param radix* return*/private static Integer xToTenV1(String num, Integer radix) {if (num.length() 0 || num.charAt(0) -) {throw new IllegalArg…...

VS2009和VS2022的错误列表可复制粘贴为表格

在VS2019或VS2022中&#xff0c;可看到如下错误列表&#xff1a; 如果复制这两行错误信息&#xff1a; 然后把它粘贴到word文件&#xff0c;就可以看到以下表格&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0020 未定义标识符 "dd"…...

springboot3 liquibase SQL执行失败自动回滚,及自动打tag

一&#xff1a; 自动执行回滚&#xff0c; 已执行成功的忽略&#xff0c;新sql执行失败则执行新sql文件中的回滚sql pom.xml <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>4.25.0&…...

Flink入门之核心概念(三)

任务槽 TaskSlots: 任务槽&#xff0c;是TaskManager提供的用于执行Task的资源&#xff08;CPU 内存&#xff09; TaskManager提供的TaskSlots的个数&#xff1a;主要由Taskmanager所在机器的CPU核心数来决定&#xff0c;不能超过CPU的最大核心数 1.可以在flink/conf/flink-c…...

算法备胎hash和队列的特征——第五关青铜挑战

内容1.Hash存储方式2.Hash处理冲突的方式3.队列存储的基本特征4.如何使用链表来实现栈 1.Hash 基础 1.1Hash的概念和基本特征 哈希&#xff08;Hash&#xff09;也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#…...

LLM之Agent(五)| AgentTuning:清华大学与智谱AI提出AgentTuning提高大语言模型Agent能力

​论文地址&#xff1a;https://arxiv.org/pdf/2310.12823.pdf Github地址&#xff1a;https://github.com/THUDM/AgentTuning 在ChatGPT带来了大模型的蓬勃发展&#xff0c;开源LLM层出不穷&#xff0c;虽然这些开源的LLM在各自任务中表现出色&#xff0c;但是在真实环境下作…...

LLM之Agent(三):HuggingGPT根据用户需求自动调用Huggingface合适的模型

​ 浙大和微软亚洲研究院开源的HuggingGPT&#xff0c;又名JARVIS&#xff0c;它可以根据用户的自然语言描述的需求就可以自动分析需要哪些AI模型&#xff0c;然后去Huggingface上直接调用对应的模型&#xff0c;最终给出用户的解决方案。 一、HuggingGPT的工作流程 它的…...

【上海大学数字逻辑实验报告】五、记忆元件测试

一、实验目的 掌握R-S触发器、D触发器和JK触发器的工作原理及其相互转换。学会用74LS00芯片构成钟控RS触发器。学会用74LS112实现D触发器学会在Quartus II上用D触发器实现JK触发器。 二、实验原理 基本R-S触发器是直接复位-置位的触发器&#xff0c;它是构成各种功能的触发器…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...