目录
了解File和FileInfo之前我们先看四个枚举
注:FileAccess/FileShare/FileMode/FileOptions的解释均摘自https://learn.microsoft.com/zh-cn/dotnet/api/system.io.file?view=net-6.0
一.FileAccess
指定对文件的读取和写入访问权限。
Read 1
对文件的读访问。 可从文件中读取数据。 与 Write 组合以进行读写访问。
Write 2
文件的写访问。 可将数据写入文件。 与 Read 组合以进行读写访问。
ReadWrite 3
对文件的读写访问权限。 可从文件读取数据和将数据写入文件。
二.FileShare
指定已使用的文件允许的访问级别。
None 0
谢绝共享当前文件。 文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
Read 1
允许随后打开文件读取。 如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Write 2
允许随后打开文件写入。 如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
ReadWrite 3
允许随后打开文件读取或写入。 如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Delete 4
允许随后删除文件。
Inheritable 16
使文件句柄可由子进程继承。 Win32 不直接支持此功能。
三.FileMode
指定是否保留或覆盖现有文件的内容,以及创建现有文件的请求是否会导致异常。
CreateNew 1
指定操作系统应创建新文件。 这需要 Write 权限。 如果文件已存在,则将引发 IOException异常。
Create 2
指定操作系统应创建新文件。 如果此文件已存在,则会将其覆盖。 这需要 Write 权限。 FileMode.Create 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。 如果该文件已存在但为隐藏文件,则将引发 UnauthorizedAccessException异常。
Open 3
指定操作系统应打开现有文件。 打开文件的能力取决于 FileAccess 枚举所指定的值。 如果文件不存在,引发一个 FileNotFoundException 异常。
OpenOrCreate 4
指定操作系统应打开文件(如果文件存在);否则,应创建新文件。 如果用 FileAccess.Read 打开文件,则需要 Read权限。 如果文件访问为 FileAccess.Write,则需要 Write权限。 如果用 FileAccess.ReadWrite 打开文件,则同时需要 Read 和 Write权限。
Truncate 5
指定操作系统应打开现有文件。 该文件被打开时,将被截断为零字节大小。 这需要 Write 权限。 尝试从使用 FileMode.Truncate 打开的文件中进行读取将导致 ArgumentException 异常。
Append 6
若存在文件,则打开该文件并查找到文件尾,或者创建一个新文件。 这需要 Append 权限。 FileMode.Append 只能与 FileAccess.Write 一起使用。 试图查找文件尾之前的位置时会引发 IOException 异常,并且任何试图读取的操作都会失败并引发 NotSupportedException 异常。
四.FileOptions
表示用于创建 FileStream 对象的高级选项。
None 0
指示在生成 FileStream 对象时,不应使用其他选项。
Encrypted 16384
指示文件是加密的,只能通过用于加密的同一用户帐户来解密。
DeleteOnClose 67108864
指示当不再使用某个文件时,自动删除该文件。
SequentialScan 134217728
指示按从头到尾的顺序访问文件。 系统可将此选项用作优化文件缓存的提示。 如果应用程序移动用于随机访问的文件指针,可能不发生优化缓存,但仍然保证操作的正确性。 如果指定此标志,可提升某些案例中的性能。
RandomAccess 268435456
指示随机访问文件。 系统可将此选项用作优化文件缓存的提示。
Asynchronous 1073741824
指示文件可用于异步读取和写入。
WriteThrough -2147483648
指示系统应通过任何中间缓存、直接写入磁盘。
五.File 和 FileInfo的异同
1.File 和 FileInfo都提供了针对文件的操作
2.File是静态类 因此所有的方法都需要正在处理的文件路径
3.File可以对多个不同路径的对象使用
4.File每次使用都需要进行安全检查
5.FileInfo的构造函数需要传入路径,因此FileInfo只能对单个对象(可重复的)使用,不需要总是安全检查
六.方法
注:篇幅有限只演示部分常用方法
1.File
Create(string path);
在指定路径中创建或覆盖文件。
Create(string path, int bufferSize);
创建或覆盖指定的文件。
Create(string path, int bufferSize, FileOptions options);
创建或覆盖指定的文件,指定缓冲区大小和一个描述如何创建或覆盖该文件的 System.IO.FileOptions 值。
public void CreateFile() {
//创建或者覆盖文件
using(FileStream fs = File.Create(path, 1024, FileOptions.Asynchronous)) {
}
}
Create(string path, int bufferSize, FileOptions options, FileSecurity fileSecurity);
创建或覆盖具有指定的缓冲区大小、文件选项和文件安全性的指定文件。
CreateText(String)
创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。
public void CreateFile() {
//创建或者覆盖文件
using(StreamWriter fs = File.CreateText(path)) {
fs.WriteLine("xxxxxxxx");
}
}
Exists(String)
确定指定的文件是否存在。
public void HaveFile() {
bool have = File.Exists(path);
Console.WriteLine($"拥有当前文件:{have}");
}
因为已经创建过这个文件了 所以返回的时true
Open(String, FileMode)
通过不共享的读/写访问权限打开指定路径上的 FileStream。
Open(String, FileMode, FileAccess)
通过指定的模式和不共享的访问权限打开指定路径上的 FileStream。
public void OpenFile() {
byte[] array = new byte[] { 1, 1, 1, 1, 1, 1, 1 };
using(FileStream fs = File.Open(path, FileMode.Open,FileAccess.Read)) {
fs.Write(array, 0, array.Length);
}
}
我以只读的方式打开文件后 向文件写入数据
修改后
public void OpenFile() {
byte[] array = new byte[] { 1, 1, 1, 1, 1, 1, 1 };
using(FileStream fs = File.Open(path, FileMode.Open, FileAccess.ReadWrite)) {
fs.Write(array, 0, array.Length);
}
}
可以看到它覆盖了我之前文本中的xxxxxxxx 但是长度不够没有完全覆盖
Open(String, FileMode, FileAccess, FileShare)
打开指定路径上的 FileStream,具有带读、写或读/写访问的指定模式和指定的共享选项。
Open(String, FileStreamOptions)
FileStream使用指定的路径、创建模式、读/写和共享权限、其他 FileStreams 可以具有的对同一文件的访问权限、缓冲区大小、附加文件选项和分配大小初始化类的新实例。
OpenRead(String)
打开现有文件以进行读取。
相当于File.Open(path,FileMode.Open,FileAccess.Read)
OpenText(String)
打开现有 UTF-8 编码文本文件以进行读取。
相当于:
FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.UTF8);
OpenWrite(String)
打开一个现有文件或创建一个新文件以进行写入。
相当于File.Open(path,FileMode.Open,FileAccess.Write)
ReadAllBytes(String)
打开一个二进制文件,将文件的内容读入一个字节数组,然后关闭该文件。
public void ReadFile() {
byte[] array = File.ReadAllBytes(path);
for(int i = 0; i < array.Length; i++)
Console.WriteLine($"打印读取内容:{array[i]}");
}
ReadAllLines(String)
打开一个文本文件,读取文件的所有行,然后关闭该文件。
ReadAllLines(String, Encoding)
打开一个文件,使用指定的编码读取文件的所有行,然后关闭该文件。
ReadAllText(String)
打开一个文本文件,读取文件中的所有文本,然后关闭此文件。
ReadAllText(String, Encoding)
打开一个文件,使用指定的编码读取文件中的所有文本,然后关闭此文件。
ReadLines(String)
读取文件的行。
ReadLines(String, Encoding)
读取具有指定编码的文件的行。
public void ReadFile() {
foreach(var i in File.ReadLines(path, Encoding.UTF8))
Console.WriteLine($"打印读取内容:{i}");
}
WriteAllBytes(String, Byte[])
创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。
public void WriteFile() {
byte[] all = new byte[] { 231, 139, 151 };
File.WriteAllBytes(path, all);
}
我们修改1.txt的内容为:
然后运行
运行后发现文本内容被完全覆盖(以前比现在长的也没了)
WriteAllLines(String, IEnumerable<String>)
创建一个新文件,向其中写入一个字符串集合,然后关闭该文件。
WriteAllLines(String, IEnumerable<String>, Encoding)
使用指定的编码创建一个新文件,向其中写入一个字符串集合,然后关闭该文件。
WriteAllLines(String, String[])
创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。
WriteAllLines(String, String[], Encoding)
创建一个新文件,使用指定编码在其中写入指定的字符串数组,然后关闭该文件。
WriteAllText(String, String)
创建一个新文件,向其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则覆盖该文件。
WriteAllText(String, String, Encoding)
创建一个新文件,使用指定编码向其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则覆盖该文件。
Copy(String, String)
将现有文件复制到新文件。 不允许覆盖同名的文件。
Copy(String, String, Boolean)
将现有文件复制到新文件。 允许覆盖同名的文件。
public void CopyFile() {
File.Copy(path, @"G:\111\11\1.txt",true);
}
改为false
public void CopyFile() {
File.Copy(path, @"G:\111\11\1.txt", false);
}
Move(String, String)
将指定文件移到新位置,提供要指定新文件名的选项。
public void MoveFile() {
File.Move(path, @"G:\111\11");
}
当文件存在时会报错
Replace(String, String, String)
使用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。
Replace(String, String, String, Boolean)
用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份,还可以忽略合并错误。
public void ReplaceFile() {
File.Replace(path, @"G:\111\11\1\2.text", @"G:\111\11\1\3.text");
}
替换的时候文件不存在也会报错
AppendAllLines(String, IEnumerable<String>)
向一个文件中追加行,然后关闭该文件。 如果指定文件不存在,此方法会创建一个文件,向其中写入指定的行,然后关闭该文件。
AppendAllLines(String, IEnumerable<String>, Encoding)
使用指定的编码向一个文件中追加行,然后关闭该文件。 如果指定文件不存在,此方法会创建一个文件,向其中写入指定的行,然后关闭该文件。
创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件或新文件(如果指定文件不存在)。
public void AppFile() {
List<string> allLine = new List<string>();
for(int i = 0; i < 5; i++)
allLine.Add($"xxxxxxx:{i}");
File.AppendAllLines(path, allLine, Encoding.UTF8);
}
只追加 不覆盖 从最后一行还是追加,如果最后一行有换行符 就从最后一行下一行开始添加 否则第一行追加到最后一行
AppendAllText(String, String)
打开一个文件,向其中追加指定的字符串,然后关闭该文件。 如果文件不存在,此方法将创建一个文件,将指定的字符串写入文件,然后关闭该文件。
AppendAllText(String, String, Encoding)
使用指定的编码将指定的字符串追加到文件中,如果文件还不存在则创建该文件。
public void AppFile() {
string contents = "xxxxxxx";
File.AppendAllText(path, contents, Encoding.UTF8);
}
Encrypt(String)
将某个文件加密,使得只有加密该文件的帐户才能将其解密。
public void EncryptFile() {
File.Encrypt(path);
}
Decrypt(String)
使用 Encrypt(String) 方法解密由当前帐户加密的文件。
public void DecryptFile() {
File.Decrypt(path);
}
Delete(String)
删除指定的文件
public void DelectFile() {
File.Delete(path);
}
文件被删除了
2.FileInfo
构造函数
FileInfo(String)
初始化作为文件路径的包装的 FileInfo 类的新实例。
fileInfo = new FileInfo("G:/111/1.text");
属性
Directory
获取父目录的实例。
DirectoryName
获取表示目录的完整路径的字符串。
Exists
获取指示文件是否存在的值。
IsReadOnly
获取或设置确定当前文件是否为只读的值。
Length
获取当前文件的大小(以字节为单位)。
Name
获取文件名。
public void CreateFileInfo() {
//没有初始化直接嗲用Exists会报错
fileInfo = new FileInfo("G:/111/1.text");
if(fileInfo.Exists) {
fileInfo.IsReadOnly = false;
Console.WriteLine($"当前文件是否是只读文件:{fileInfo.IsReadOnly}");
Console.WriteLine($"当前文件长度为:{fileInfo.Length}");
Console.WriteLine($"当前文件的名字是:{fileInfo.Name}");
Console.WriteLine($"打印当前文件的路径:{fileInfo.DirectoryName}");
}
}
打印:
注: 当文件没有初始化的时候使用fileInfo.Exists时会报错
方法
AppendText()
创建一个 StreamWriter,它向 FileInfo 的此实例表示的文件追加文本。
CopyTo(String)
将现有文件复制到新文件,不允许覆盖现有文件。
CopyTo(String, Boolean)
将现有文件复制到新文件,允许覆盖现有文件。
Create()
创建文件。
public void CreateFile() {
fileInfo = new FileInfo(@"G:\111\11\1\1.txt");
fileInfo.Create();
}
如果当前文件不存在 fileInfo = new FileInfo 并不能创建文件 需要结合file.Create()使用
如果已经有当前文件 创建的新文件会覆盖原文件
CreateText()
创建写入新文本文件的 StreamWriter。
public void CreateFileText() {
fileInfo = new FileInfo(@"G:\111\11\1\2.txt");
using(StreamWriter sw = fileInfo.CreateText()) {
sw.WriteLine("11111");
}
}
创建文件并写入指定内容
Decrypt()
使用 Encrypt() 方法解密由当前帐户加密的文件。和File.Decrypt类似 不再解释
Delete()
永久删除文件。和File.Delete类似 不再解释
Encrypt()
将某个文件加密,使得只有加密该文件的帐户才能将其解密。和File.Enctypt类似 不再解释
MoveTo(String)
将指定文件移到新位置,提供要指定新文件名的选项。和File.Move类似 不再解释
Open(FileMode)
在指定的模式中打开文件。
Open(FileMode, FileAccess)
用读、写或读/写访问权限在指定模式下打开文件。
Open(FileMode, FileAccess, FileShare)
用读、写或读/写访问权限和指定的共享选项在指定的模式中打开文件。
OpenRead()
创建一个只读的 FileStream。
OpenText()
创建使用从现有文本文件中读取的 UTF8 编码的 StreamReader。
OpenWrite()
创建一个只写的 FileStream。
和File.Open类似 不再解释
Replace(String, String)
使用当前 FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份
Replace(String, String, Boolean)
使用当前 FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。 还指定是否忽略合并错误。
和File.Replace类似 不再解释