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 | 创建一个 StreamReader,使用 UTF8 编码从现有文本文件读取。 |
OpenWrite | 创建一个只写的 FileStream。 |
Replace | 用当前 FileInfo 对象描述的文件替换指定文件的内容,删除原始文件,并创建被替换文件的备份。 |
ToString | 返回路径字符串。 |
以下示例演示了如何手动从文件中读取字节,然后使用 UTF8 编码将它们转换为字符串。
示例:使用 FileInfo 类读取文件
//Create object of FileInfo for specified path
FileInfo fi = new FileInfo(@"D:DummyFile.txt");
//Open file for Read-Write
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
//create byte array of same size as FileStream length
byte[] fileBytes = new byte[fs.Length];
//define counter to check how much bytes to read. Decrease the counter as you read each byte
int numBytesToRead = (int)fileBytes.Length;
//Counter to indicate number of bytes already read
<span className="kwrd">int</span> numBytesRead = 0;
//iterate till all the bytes read from FileStream
while (numBytesToRead > 0)
{
int n = fs.Read(fileBytes, numBytesRead, numBytesToRead);
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
//Once you read all the bytes from FileStream, you can convert it into string using UTF8 encoding
string filestring = Encoding.UTF8.GetString(fileBytes);
如上述代码所示,你需要编写大量代码才能从 FileSream 读取/写入字符串。相同的读/写操作可以使用 StreamReader 和 StreamWriter 轻松完成。
以下示例演示了 StreamReader 如何轻松地从文件中读取字符串
示例:使用 StreamReader 读取文件
//Create object of FileInfo for specified path
FileInfo fi = new FileInfo(@"D:DummyFile.txt");
//Open file for ReadWrite
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.Read , FileShare.Read);
//Create object of StreamReader by passing FileStream object on which it needs to operates on
StreamReader sr = new StreamReader(fs);
//Use ReadToEnd method to read all the content from file
<span className="kwrd">string</span> fileContent = sr.ReadToEnd();
//Close StreamReader object after operation
sr.Close();
fs.Close();
请注意,`fi.Open()` 有三个参数:第一个参数是 FileMode,用于创建和打开文件(如果文件不存在);第二个参数 FileAccess 用于指示读取操作;第三个参数是为了在文件打开时与其它用户共享文件进行读取。
以下示例演示了 StreamWriter 如何轻松地将字符串写入文件
示例:使用 StreamWriter 将文本写入文件
//Create object of FileInfo for specified path
FileInfo fi = new FileInfo(@"D:DummyFile.txt");
//Open file for ReadWrite
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read );
//Create StreamWriter object to write string to FileSream
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Another line from streamwriter");
sw.Close();
无法在同一个 FileStream 对象上同时进行读写操作。如果你正在从文件中读取,请创建单独的 FileStream 对象来写入同一个文件,如下所示
示例:StreamReader 和 StreamWriter
//Create FileInfo object for DummyFile.txt
FileInfo fi = new FileInfo(@"D:DummyFile.txt");
//open DummyFile.txt for read operation
FileStream fsToRead = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite , FileShare.ReadWrite);
//open DummyFile.txt for write operation
FileStream fsToWrite = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
//get the StreamReader
StreamReader sr = new StreamReader(fsToRead);
//read all texts using StreamReader object
string fileContent = sr.ReadToEnd();
sr.Close();
//get the StreamWriter
StreamWriter sw = new StreamWriter(fsToWrite);
//write some text using StreamWriter
sw.WriteLine("Another line from streamwriter");
sw.Close();
//close all Stream objects
fsToRead.Close();
fsToWrite.Close();
因此,你可以使用 FileInfo、StreamReader 和 StreamWriter 类来读取/写入物理文件中的内容。
延伸阅读
- FileInfo 类成员
- StreamReader 类成员
- StreamWriter 类成员