C# I/O 文件和目录二 : File和FileInfo

目录

一.FileAccess

二.FileShare

三.FileMode

四.FileOptions

五.File 和 FileInfo的异同

六.方法

1.File

2.FileInfo 

构造函数

属性

方法


了解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类似 不再解释

猜你喜欢

转载自blog.csdn.net/SmillCool/article/details/127446144