流,即是二进制数值,文件和流 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 类不会直接打开或读取文件,只是表示文件的元数据信息。如果你需要访问文件内容,你需要使用其他类,如 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文件夹了,在里面创建点东西。
//获取路径下的子文件夹,遍历一下
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);