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会自动换行
![](https://img-blog.csdnimg.cn/img_convert/251be0c87fc84869b0f5ea92d74aba58.png)
其中Encoding.UTF8是指编码格式,如果是utf-8可以默认不写,换成Encoding.ASCII再执行一次,因为记事本是utf-8的编码格式,所以打开出现了乱码
![](https://img-blog.csdnimg.cn/img_convert/c514ac3fee734596ac745850020d98ec.png)
AppendAllText
与AppendAllLines不同的是使用AppendAllText时不会进行换行
File.AppendAllText(@"D:\val\log.txt",$"追加文本内容1{DateTime.Now}");
File.AppendAllText(@"D:\val\log.txt",$"追加文本内容2{DateTime.Now}");
![](https://img-blog.csdnimg.cn/img_convert/878e7c58645c4b199c2af8ed95b2e5b0.png)
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则是一种操作,不进行调用也不会有内存泄漏的问题。
![](https://img-blog.csdnimg.cn/img_convert/3e6cb7dcd602431087e678dc4decd2f6.png)
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----");
![](https://img-blog.csdnimg.cn/img_convert/b521f326010840ceb9821060c86a9573.png)
执行多次后打开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]);
![](https://img-blog.csdnimg.cn/img_convert/84b87b2afef8461cae1d4d89ae046547.png)
FileInfo类
FileInfo 类表示一个文件的元数据,包括文件名、文件路径、文件大小、创建时间、修改时间等等。使用 FileInfo 类,你可以获取或设置这些文件属性,并执行一些简单的操作,比如把文件拷贝到指定目录、移动文件到别的位置、重命名文件等等。
File 类提供了一些静态方法来操作文件本身,比如读取文件内容、写入文件内容、删除文件等等。使用 File 类,你可以执行一些基本的文件操作,而无需使用文件对象或元数据,比如复制、移动或重命名文件。
如果你只需要获取或修改文件的元数据,使用 FileInfo 类更好。而如果你需要执行一些基本的文件操作,使用 File 类更合适。
如果对同一个文件进行多次操作,使用FileInfo会更加高效,因为FileInfo不会做安全检查
var fileInfo = new FileInfo(@"D:\val\log.txt");
![](https://img-blog.csdnimg.cn/img_convert/eb66ac819643444791384c3743ebaec9.png)
可以看出FileInfo类的方法比File类要多,并且使用FileInfo不需要使用 using 语句块自动关闭和释放这些类的资源,因为 FileInfo 类不会直接打开或读取文件,只是表示文件的元数据信息。如果你需要访问文件内容,你需要使用其他类,如 FileStream 或 StreamReader。👇
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文件夹了,在里面创建点东西。
![](https://img-blog.csdnimg.cn/img_convert/71c8012c648b46449db6f1aa459c322b.png)
//获取路径下的子文件夹,遍历一下
var enumerateDirectories = directoryInfo.EnumerateDirectories();
foreach (var VARIABLE in enumerateDirectories)
{
Console.WriteLine(VARIABLE.FullName);
}
![](https://img-blog.csdnimg.cn/img_convert/4f3904cb25e241b4b01e177a4286d2b6.png)
给EnumerateDirectories方法增加一点参数,
var enumerateDirectories = directoryInfo.EnumerateDirectories("*",SearchOption.AllDirectories);
获取到了路径下的所有文件夹
![](https://img-blog.csdnimg.cn/img_convert/6066b4a472df4471aec430c175e9e36e.png)
获取文件
var fileInfo = new DirectoryInfo(@"D:\val");
var fileInfos = fileInfo.GetFiles("*.*", SearchOption.AllDirectories);
![](https://img-blog.csdnimg.cn/img_convert/868e07c3551ff98aff455ba0c856d483.png)
相关文章
- C#-支持文件拖拽
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
- C# 将前端传来的图片文件分别以大图和缩略图保存
- C#订阅与发布标准实现 visual studio code .net 开发 设计模式之☞策略模式 C#字符串转二进制、二进制转字符串 c# 接口的协变和逆变 c# 使用迭代器来创建可枚举类型 博客园首页新随笔联系订阅管理 随笔 - 117 文章 - 0 评论 - 57 c# 创建,加载,修改XML文档
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- C# IL DASM 使用-破解c#软件方法
- c# net , layui文件上传,手写-普通文件上传,上传并添加水印,上传并生成缩略图,上传并删除指定文件,
- C#【文件操作篇】保存内容到txt文件
- C#【必备技能篇】调用cmd文件,并读取其输出数据(通过.cmd调用 .py程序 或 .py生成的.exe)
- 在c#中将debug/release下文件打包成一个可直接运行exe文件
- c#中中读取嵌入和使用资源文件的方法
- C# 跨线程调用控件
- C#代码创建Xml文件
- C# 文件内容的操作
- 使用C#读写结构化的二进制文件
- 《C#零基础入门之百识百例》(九十二)本地数据交互 -- 文件概述 -- File类介绍和使用
- C# 使用xsd文件验证XML 格式是否正确
- C#-IO-正由另一进程使用,因此该进程无法访问该文件
- C#-IO-正由另一进程使用,因此该进程无法访问该文件
- C# winform 窗体弹出选择目录或文件 的对话框
- C#中【pdb】文件
- 谈谈C#文件监控对象FileSystemWatcher使用感受
- C# 使用FileSystemWatcher类来对一个日志文件的变化进行实时监测