C#-快速剖析文件和流,并使用(持续更新)

news2024/11/16 19:31:13

目录

一、概述

二、文件系统

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:获取路径的根部分;

4、文件与文件夹弹窗

文件弹窗,选择一个文件,返回文件完整路径:

OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = Directory.GetCurrentDirectory();
openFileDialog.Title = "选择上传文件";
openFileDialog.Filter = "所有文件(*.*)|*.*|文字文件(*.pdf,*.txt)|*.pdf;*.txt";
openFileDialog.Multiselect = false;
openFileDialog.ShowDialog();
var stream= openFileDialog.OpenFile();
var filename=openFileDialog.FileName;

文件夹弹窗,选择一个文件夹,返回文件夹完整路径:

    System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
    folderBrowser.Description = "选择文件夹";
    folderBrowser.ShowNewFolderButton = true;
    folderBrowser.RootFolder=Environment.SpecialFolder.DesktopDirectory;
    folderBrowser.ShowDialog();
    var dirpath = folderBrowser.SelectedPath;

 保存文件弹窗:

    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.InitialDirectory = Directory.GetCurrentDirectory();
    saveFileDialog.Title = "保存文件";
    saveFileDialog.Filter = "所有文件(*.*)|*.*|文字文件(*.pdf,*.txt)|*.pdf;*.txt";
    var isOk = saveFileDialog.ShowDialog();
    var stream = saveFileDialog.OpenFile();


三、流

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

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

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()。。。读取指定类型返回;      

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker私有镜像仓库搭建 带图形化界面的

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址:https://hub.docker.com/_/registry 先配置私服的信任地址: # 打开要修改的文件 vi /etc/docker/daemon.json # 添加内容: "insecure-registries":["http://192.…

定时器编程前配置和控制LED隔一秒亮灭

1.配置定时器 0 工作模式16位计时 2.给初值,定一个10ms出来 3.开始计时

pygame学习--精灵组、碰撞检测、精灵更新

pygame学习--精灵组、碰撞检测、精灵更新 一.效果二.代码 通过pygame库,模拟种群的分化 1.X从左往右移动,表示年龄的增加;Y坐标表示阶层 2.随着X坐标不断增大,圆逐渐增大,颜色也加深 3.精灵越多,碰撞后死亡的概率越大,诞生新精灵的概率越小 4.每个精灵都有随机的运动速度及Y坐标…

关于YOLO8学习(五)安卓部署ncnn模型--视频检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 简介 本文将会讲解: (1)使用前文生成的ncnn模型,部署到安卓端,并且实现视频中,人脸的检测…

图像压缩问题

图像压缩问题的bilibil讲解 1.问题引入 首先,图像是由像素组合成的,每个像素都有灰度值,灰度值是体现像素的颜色的。灰度值从0~255,灰度值占用的位数就是像素占用的位数。我们要存储一个图像就要存储它的所有像素。现在的问题是我…

【Github】将github仓库作为图床使用

创建github仓库 首先创建一个github仓库专门用于存储图片,具体步骤如下: 1.点击新的仓库按钮 2.初始配置:随便填写一个仓库名;这里的仓库状态一定要是public公开的,不然后面访问不了图片 下载PicGo PicGo官网 在A…

【Linux系统编程】第十三弹---项目自动化构建工具-make/Makefile

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、背景 2、编写makefile 2、make原理 3、理解makefile 4、优化makefile 总结 1、背景 ★ 会不会写makefile,从…

杭州等级保护测评—提升企业安全等级

4月初,在和杭州未来科技城正式签署“重点企业落户协议”之后,新一代本地生活服务平台“AC生活”又获得了由中华人民共和国公安部颁发的“信息系统安全等级保护”备案证书。尽管工作人员一再强调“公司还处在研发期”、“产品还不成熟”,但随着…

2.spring security 简单入门

创建springboot 项目&#xff0c;引入spring security坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring security坐标--><dependency&g…

【每日力扣】141. 环形链表与142. 环形链表 II

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟…

恶补《操作系统》5_2——王道学习笔记

5.2_1 I-O核心子系统 1、用户层软件 假脱机系统 2、设备独立性软件&#xff08;设备无关性软件&#xff09; IO调度、设备保护、设备分配与回收、缓冲区管理 3、设备驱动程序&#xff08;比如打印机驱动&#xff09; 4、中断处理程序 5、硬件 5.2_2 假脱机技术&#xff…

爬虫工具:避免复制文字收费,VIP。。

step ctrl shift i 打开开发者工具 点击...打开设置勾选禁用JavaScript Principle 事件处理&#xff1a;JavaScript 用于处理用户交互&#xff0c;例如点击、滚动、输入等禁用 JavaScript 后&#xff0c;页面上的所有 JavaScript 代码都将不会执行

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…

FastAPI - Pydantic相关应用

参考链接&#xff1a;Pydantic官方文档 文章目录 定义数据模型创建模型实例数据验证数据转换模型转换模型更新模型配置辅助类Field Pydantic 是一个 Python 库&#xff0c;主要用于数据验证和管理。数据验证是指检查数据是否符合预定的规则和格式&#xff0c;比如检查数据类型是…

c++项目文件夹重命名

文章目录 一、改变项目文件夹名&#xff1f;1. 手动改名2. 自动改名 二、全局替换原文件名的引用1.打开Visual Studio 2022软件 一、改变项目文件夹名&#xff1f; 1. 手动改名 文件名一个一个改挺麻烦的 2. 自动改名 import java.io.File; import java.util.Optional;publi…

leetcode_47.全排列 II

47. 全排列 II 题目描述&#xff1a;给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] …

Optional学习记录

Optional出现的意义 在Java中&#xff0c;我们经常遇到的一种异常情况&#xff1a;空指针异常&#xff0c;在原本的编程中&#xff0c;为了避免这种异常&#xff0c;我们通常会向对象进行判断&#xff0c;然而&#xff0c;过多的判断语句会让我们的代码显得臃肿不堪。 所以在J…

老Java学 Go 笔录(一) 到底为什么要学习 go ?

文章目录 一.到底什么是go ?1.1 历史渊源1.2 优秀特性1.2 应用场景1.3 和 java 有什么不同 二.聊一聊一个 java 的我为什么要学一学 go ?2.1 生活不止眼前苟且,还有诗和远方.但先要苟住2.2 了解一项新技能 三.打算怎么去学3.1 官网大概搂一遍3.2 b 站的学习视频跟着走一回3.3…

经纬度聚类:聚类算法比较

需求&#xff1a; 将经纬度数据&#xff0c;根据经纬度进行聚类 初始数据 data.csv K均值聚类 简介 K均值&#xff08;K-means&#xff09;聚类是一种常用的无监督学习算法&#xff0c;用于将数据集中的样本分成K个不同的簇&#xff08;cluster&#xff09;。其基本思想是…

产品AB测试设计

因为vue2项目升级到vue3经历分享1&#xff0c;vue2项目升级到vue3经历分享2&#xff0c;前端系统升级&#xff0c;界面操作也发生改变&#xff0c;为了将影响降到最低&#xff0c;是不能轻易让所有用户使用新系统的。原系统使用好好的&#xff0c;如果新界面用户不喜欢&#xf…