English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник по основам C#

C# Продвинутый учебник

C# Ориентированный на объекты (OOP)

FileInfo в C#

 Здесь вы узнаете, как использовать класс 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Создает файловый поток только для чтения.
OpenTextСоздает StreamReader с кодировкой UTF8, который может читать из существующего текстового файла.
OpenWriteСоздает файловый поток только для записи.
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);

Как показано в приведенном выше коде, вам нужно написать много кода, чтобы читать/писать строки из FileStream. Однако с помощью StreamReader и StreamWriter можно легко выполнить те же чтение/запись операции.

Ниже приведен пример того, как StreamReader упрощает чтение строк из файла:

Пример: Чтение файла с помощью StreamReader

//Создать FileInfo объект для указанного пути            
FileInfo fi = new FileInfo(@"D:\DummyFile.txt");
        
//Открыть файл для чтения/записи
FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read); 
//Создать объект StreamReader, передаваяFileStream объект, который нужно обработать
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 объект для записи строки в FileStream
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Ещё строка из 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("Ещё строка из StreamWriter");
sw.Close();
//Закрыть все Stream объекты
fsToRead.Close();
fsToWrite.Close();

Таким образом, вы можете использовать классы FileInfo, StreamReader и StreamWriter для чтения/записи содержимого физического файла.