C# FileInfo

 在这里,您将学习如何使用FileInfo类对物理文件执行读/写操作。

FileInfo类提供与静态File类相同的功能,但是您可以通过手动编写用于从文件读取或写入字节的代码来对文件的读/写操作具有更多控制权。

FileInfo的重要属性和方法:

属性用法
Directory获取父目录的实例。
DirectoryName获取表示目录的完整路径的字符串。
Exists获取一个值,该值指示文件是否存在。
Extension获取表示文件扩展部分的字符串。
FullName获取目录或文件的完整路径。
IsReadOnly获取或设置一个值,该值确定当前文件是否为只读。
LastAccessTime获取或设置上次访问当前文件或目录的时间
LastWriteTime获取或设置上次写入当前文件或目录的时间
Length获取当前文件的大小(以字节为单位)。
Name获取文件的名称。
方法用法
AppendText创建一个StreamWriter,将文本追加到FileInfo的此实例表示的文件。
CopyTo将现有文件复制到新文件,不允许覆盖现有文件。
Create创建一个文件。
CreateText创建一个写入新文本文件的StreamWriter。
Decrypt使用Encrypt方法解密由当前帐户加密的文件。
Delete删除指定的文件。
Encrypt加密文件,以便只有用于加密文件的帐户才能解密该文件。
GetAccessControl获取一个FileSecurity对象,该对象封装了指定文件的访问控制列表(ACL)条目。
MoveTo将指定的文件移动到新位置,并提供指定新文件名的选项。
Open在指定的FileMode中打开一个。
OpenRead创建一个只读FileStream。
OpenText创建具有UTF8编码的StreamReader,该编码器可从现有文本文件读取。
OpenWrite创建一个只写FileStream。
Replace用当前FileInfo对象描述的文件替换指定文件的内容,删除原始文件,并创建替换文件的备份。
ToString以字符串形式返回路径。

下面的示例显示如何手动从文件读取字节,然后使用UTF8编码将它们转换为字符串:

示例:使用FileInfo类读取文件

//为指定路径创建FileInfo对象            
FileInfo fi = new FileInfo(@"D:\DummyFile.txt");

//打开文件进行读\写
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); 

//创建与FileStream长度相同大小的字节数组
byte[] fileBytes = new byte[fs.Length];

//定义计数器以检查要读取多少字节。读取每个字节时减少计数器
int numBytesToRead = (int)fileBytes.Length;

//计数器指示已读取的字节数
int numBytesRead = 0;

//迭代直到从FileStream中读取所有字节
while (numBytesToRead > 0)
{
    int n = fs.Read(fileBytes, numBytesRead, numBytesToRead);
        
    if (n == 0)
        break;

    numBytesRead += n;
    numBytesToRead -= n;
}

//从FileStream中读取所有字节后,即可使用UTF8编码将其转换为字符串
string filestring = Encoding.UTF8.GetString(fileBytes);

如上面的代码所示,您必须编写许多代码才能从FileSream读取/写入字符串。而使用 StreamReader 和 StreamWriter 可以轻松完成相同的读/写操作。

下面的示例显示 StreamReader 如何使从文件中读取字符串变得容易:

示例:使用 StreamReader 读取文件

//为指定路径创建FileInfo对象            
FileInfo fi = new FileInfo(@"D:\DummyFile.txt");
        
//打开文件进行读\写
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.Read , FileShare.Read); 

//通过传递需要对其进行操作的FileStream对象来创建StreamReader的对象
StreamReader sr = new StreamReader(fs);

//使用ReadToEnd方法从文件读取所有内容
string fileContent = sr.ReadToEnd();

//操作后关闭StreamReader对象
sr.Close();
fs.Close();

注意,fi.Open() 它具有三个参数:

  • 第一个参数是FileMode,用于创建和打开文件(如果文件不存在);

  • 第二个参数 FileAccess 表示读取操作;

  • 第三个参数是在打开文件时与其他用户共享文件以供阅读。

下面的示例显示 StreamWriter 如何使将字符串写入文件变得更容易:

示例:使用StreamWriter将文本写入文件

//为指定路径创建FileInfo对象            
FileInfo fi = new FileInfo(@"D:\DummyFile.txt");
        
//打开文件进行读\写
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read ); 

//创建StreamWriter对象以将字符串写入FileSream
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Another line from streamwriter");
sw.Close();

不能同时对同一个 FileStream 对象执行读和写操作。如果您已经在读取文件,请创建一个单独的 FileStream 对象以写入同一文件,如下所示:

示例:StreamReader和StreamWriter

//为DummyFile.txt创建FileInfo对象
FileInfo fi = new FileInfo(@"D:\DummyFile.txt");

//打开DummyFile.txt进行读取操作
FileStream fsToRead = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite , FileShare.ReadWrite); 

//打开DummyFile.txt进行写操作
FileStream fsToWrite = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); 
          
//获取StreamReader

StreamReader sr = new StreamReader(fsToRead);
//使用StreamReader对象读取所有文本
string fileContent = sr.ReadToEnd();
sr.Close();

//获取StreamWriter
StreamWriter sw = new StreamWriter(fsToWrite);
//用StreamWriter写一些文字
sw.WriteLine("Another line from streamwriter");
sw.Close();

//关闭所有Stream对象
fsToRead.Close();
fsToWrite.Close();

因此,您可以使用FileInfo,StreamReader 和  StreamWriter类从物理文件读取/写入内容。