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}");

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🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
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组态?…...
华为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: /*** 笨办法,从左往右开始* Tips:只支持正数** 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中,可看到如下错误列表: 如果复制这两行错误信息: 然后把它粘贴到word文件,就可以看到以下表格: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0020 未定义标识符 "dd"…...
springboot3 liquibase SQL执行失败自动回滚,及自动打tag
一: 自动执行回滚, 已执行成功的忽略,新sql执行失败则执行新sql文件中的回滚sql pom.xml <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>4.25.0&…...
Flink入门之核心概念(三)
任务槽 TaskSlots: 任务槽,是TaskManager提供的用于执行Task的资源(CPU 内存) TaskManager提供的TaskSlots的个数:主要由Taskmanager所在机器的CPU核心数来决定,不能超过CPU的最大核心数 1.可以在flink/conf/flink-c…...
算法备胎hash和队列的特征——第五关青铜挑战
内容1.Hash存储方式2.Hash处理冲突的方式3.队列存储的基本特征4.如何使用链表来实现栈 1.Hash 基础 1.1Hash的概念和基本特征 哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出&#…...
LLM之Agent(五)| AgentTuning:清华大学与智谱AI提出AgentTuning提高大语言模型Agent能力
论文地址:https://arxiv.org/pdf/2310.12823.pdf Github地址:https://github.com/THUDM/AgentTuning 在ChatGPT带来了大模型的蓬勃发展,开源LLM层出不穷,虽然这些开源的LLM在各自任务中表现出色,但是在真实环境下作…...
LLM之Agent(三):HuggingGPT根据用户需求自动调用Huggingface合适的模型
浙大和微软亚洲研究院开源的HuggingGPT,又名JARVIS,它可以根据用户的自然语言描述的需求就可以自动分析需要哪些AI模型,然后去Huggingface上直接调用对应的模型,最终给出用户的解决方案。 一、HuggingGPT的工作流程 它的…...
【上海大学数字逻辑实验报告】五、记忆元件测试
一、实验目的 掌握R-S触发器、D触发器和JK触发器的工作原理及其相互转换。学会用74LS00芯片构成钟控RS触发器。学会用74LS112实现D触发器学会在Quartus II上用D触发器实现JK触发器。 二、实验原理 基本R-S触发器是直接复位-置位的触发器,它是构成各种功能的触发器…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
