C#中使用I/O文件流

流,即是二进制数值,文件和流 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);

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

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

AppendAllText

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

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

AppendText

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

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

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

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

使用范围:

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

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

生命周期:

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

Copy复制

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

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

Create创建流

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

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

Delete删除

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

Move移动

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

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

Exists判断是否存在

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

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

执行多次后打开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));

OpenRead只读

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

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

OpenWrite只写

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

ReadAllLines读取并关闭

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

FileInfo类

  • FileInfo 类表示一个文件的元数据,包括文件名、文件路径、文件大小、创建时间、修改时间等等。使用 FileInfo 类,你可以获取或设置这些文件属性,并执行一些简单的操作,比如把文件拷贝到指定目录、移动文件到别的位置、重命名文件等等。

  • File 类提供了一些静态方法来操作文件本身,比如读取文件内容、写入文件内容、删除文件等等。使用 File 类,你可以执行一些基本的文件操作,而无需使用文件对象或元数据,比如复制、移动或重命名文件。

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

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

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

可以看出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());

DirectoryInfo类(操作目录)

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

创建目录

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

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

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

EnumerateDirectories方法增加一点参数,

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

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

获取文件

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

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

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

相关文章

Android开发 Intent

1. Intent 在组件之间传递信息&#xff0c;一般需要设置发送方&#xff0c;接收方和数据。 下图是Intent 的常用属性&#xff1a; 2. Intent分类 1&#xff09;显式Intent&#xff1a;精确匹配发送方和接收方 方法一&#xff1a; startActivity(new Intent(this,MainActiv…

USB抓包分析

1、USB传输协议基本概念 一个传输(控制、批量、中断、等时)&#xff1a;由多个事务transaction组成&#xff1b; 一个事务transaction (IN、OUT、SETUP)&#xff1a;由一多个包Packet组成。USB数据在主机与usb设备间被传输&#xff0c;之间的关联叫做管道pipe。一个USB设备可以…

图片转字符画

目录一、字符画二、制作方式一、字符画 字符画&#xff1a;用字符填充创作的人物或动物图片&#xff0c;就像下面这样&#xff1a; 二、制作方式 1.使用Ps的文字工具和蒙版工具来实现 可以看下YouTube上这个教程视频&#xff1a;Photoshop CS6 Tutorial: How to Make an Edi…

企业电子招投标采购系统源码之首页设计

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

详解TCP、HTTP中的保活机制 | Keepalive和Keep-Alive

目录 &#x1f332; HTTP 的 Keep-Alive &#x1f332; TCP 的 Keepalive &#x1f332; 最后总结 &#x1f332; 参考资料 TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗&#xff1f; 这是个好问题&#xff0c;应该有不少人都会搞混&#xff0c;因为这两个东西看上…

DNS协议--笔记

引自&#xff1a; 什么是DNS&#xff1f; - 知乎 (zhihu.com) 超详细 DNS 协议解析 - 知乎 (zhihu.com) IP 地址&#xff1a;一长串能够唯一地标记网络上的计算机的数字域名&#xff1a;又称网域&#xff0c;是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组…

rust语言精要

rust基本组成 编译器&#xff1a;Rust是一门静态编译型语言。Rust官方的编译器叫rustc&#xff0c;负责将 Rust源代码编译为可执行文件或其他库文件&#xff08;.a、.so、.lib、.dll等&#xff09;。特点是跨平台的&#xff0c;后端用了LLVM。 核心库和标准库 Rust语言的语法由…

Prometheus之PromQL语法详解及使用方法

本文是向大家介绍Prometheus中PromQL的查询语法以及常用语句&#xff0c;可以帮助大家理解和掌握Prometheus的查询语言。1、简介Prometheus是通过指标名称&#xff08;metrics name&#xff09;以及对应的一组标签&#xff08;labelset&#xff09;唯一定义一条时间序列。指标名…

如何选择Facebook的各种广告形式来获取用户?

Facebook广告是吸引潜在客户的重要工具&#xff0c;但盲目投放广告却很难达到理想效果。在选择广告格式时&#xff0c;需要考虑到品牌和业务目标&#xff0c;以及目标受众的特征和偏好。下面介绍8种Facebook广告格式&#xff0c;不论您是想用视频、图片或文字&#xff0c;还是结…

云端Docker搭建ABY库以及本地CLion使用

文章目录ABY的搭建以及使用前言ABY库的下载、安装及测试CLion配置后续杂项项目改名使用其他的库最后ABY的搭建以及使用 前言 仅做记录&#xff0c;仅供参考&#xff0c;不同人有不同的使用方式命令手敲&#xff0c;可能有错&#xff0c;自己辨识勿问&#xff0c;我懂的也不多…

什么牌子的蓝牙耳机音质好又便宜?国产音质好的蓝牙耳机推荐

目前的蓝牙耳机市场涌现了越来越多的蓝牙耳机&#xff0c;不同价位主打不同的性能&#xff0c;有主打佩戴的&#xff0c;主打音质的&#xff0c;主打降噪的&#xff0c;主打游戏的等等。那么&#xff0c;什么牌子的蓝牙耳机音质好又便宜&#xff1f;针对这个问题&#xff0c;我…

Redis详解(redis线程模式、数据持久化机制、主从复制、缓存穿透、缓存击穿等)

一.redis概述redis主要用作数据库、缓存和消息中间件, 支持多种语言, 是基于内存的key-value数据结构存储系统. redis支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进行使用.redis不仅仅支持key-value数据结构, 还支持list, set, hash等数据结构.…

CHAPTER 7 HPC集群部署 - hadoop

HPC集群部署 - hadoop1. 介绍2. 优点3. 架构及相关组件3.1 HDFS3.1.1 NameNode3.1.2 DataNode3.1.3 Secondary NameNode3.1.4 Client(客户端)3.2 Mapreduce&#xff08;分布式计算框架&#xff09;3.3. HBase&#xff08;分布式列存储数据库&#xff09;3.4 Zookeeper&#xff…

【其它】玩一玩无线网桥PicoStation M2

一、无线网桥是什么&#xff1f; 无线网桥就是代替网线实现网络连接的装置。看下面这个场景&#xff0c;摄像头与录像机之间可以直接用网线连接&#xff0c;但遇到两者相距较远的情况&#xff0c;铺设网线成本太高&#xff0c;这时候可以用无线网桥进行连接。无线网桥一般成对…

SSM项目之租赁汽车管理

项⽬描述 汽⻋租赁管理系统&#xff0c;管理系统中不仅有客户的管理还有⻋辆租赁的管理&#xff0c;租赁⻋辆公司对于租⻋的流程&#xff0c;租⻋过程的问题&#xff0c;对于客户的维护及不同维度统计租⻋的情况做数据化管理&#xff0c;⽅便租⻋公司更好的维护⻋辆和⻋辆的信…

易基因: m6A RNA甲基化研究的前期探索性实验思路|干货系列

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 近年来&#xff0c;m6A RNA甲基化作为国家自然科学基金表观遗传学研究的热门领域&#xff0c;相关研究成果层出不穷&#xff0c;高分文章不断。研究方向包括疾病发生发展、发育和分化、环…

误删磁盘恢复方法

一、工具如下&#xff1a;1、磁盘分区恢复工具(分区助手 9.8.0)---链接&#xff1a;https://pan.baidu.com/s/1t3siEwtYZl7XtcNJ8t5oLg 提取码&#xff1a;9tsy2、DiskGenius 磁盘信息查看工具&#xff08;修复要收费&#xff09;&#xff1a;链接&#xff1a;https://pan.baid…

(源码篇02)webpack5中的事件调度系统和NormalModuleFactary核心逻辑

1. 书接上回&#xff0c;从 this.factorizeQueue.add(options, callback); 开始 不是很清楚上下文的兄弟&#xff0c;可以去看下我之前写的 &#xff08;源码篇01&#xff09;浅析webpack5中Compiler中重要的hook调用过程。 此文比较干&#xff0c;各位读者开始阅读前&#xf…

反射器和Spring中的IOC/DI

1.什么是反射 1&#xff09;Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c;再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 2&#xff09;Java属于先编译…

LC-1637. 两点之间不包含任何点的最宽垂直区域(模拟)

1637. 两点之间不包含任何点的最宽垂直区域 难度中等25 给你 n 个二维平面上的点 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度&#xff0c;而 y 轴上无限延伸的一块区域…