Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Console.WriteLine("Label: {0}", d.VolumeLabel); // метка тома
}
Console.WriteLine();
}
Console.ReadLine();
Вот возможный вывод:
***** Fun with DriveInfo *****
Name: C:
Type: Fixed
Free space: 284131119104
Format: NTFS
Label: OS
Name: M:
Type: Network
Free space: 4711871942656
Format: NTFS
Label: DigitalMedia
К этому моменту вы изучили несколько основных линий поведения классов Directory, DirectoryInfо и DriveInfo. Далее вы ознакомитесь с тем, как создавать, открывать, закрывать и удалять файлы, находящиеся в заданном каталоге.
Работа с типом FileInfo
Как было показано в предыдущем примере DirectoryApp, класс FileInfo позволяет получать сведения о существующих файлах на жестком диске (такие как время создания, размер и атрибуты) и помогает создавать, копировать, перемещать и удалять файлы. В дополнение к набору функциональности, унаследованной от FileSystemInfo, класс FileInfo имеет ряд уникальных членов,которые описаны в табл. 20.4.
Обратите внимание, что большинство методов класса FileInfo возвращают специфический объект ввода-вывода (например, FileStream и StreamWriter), который позволяет начать чтение и запись данных в ассоциированный файл во множестве форматов. Вскоре мы исследуем указанные типы, но прежде чем рассмотреть работающий пример, давайте изучим различные способы получения дескриптора файла с использованием класса FileInfo.
Метод FileInfo.Create()
Следующий набор примеров находится в проекте консольного приложения по имени SimpleFileIO. Один из способов создания дескриптора файла предусматривает применение метода FileInfo.Create():
using System;
using System.IO;
Console.WriteLine("***** Simple IO with the File Type *****n");
// Измените это на папку на своей машине, к которой вы имеете доступ
// по чтению/записи или запускайте приложение от имени администратора.
var fileName = $@"C{Path.VolumeSeparatorChar}
{Path.DirectorySeparatorChar}temp
{Path.DirectorySeparatorChar}Test.dat";
// Создать новый файл на диске С:.
FileInfo f = new FileInfo(fileName);
FileStream fs = f.Create();
// Использовать объект FileStream...
// Закрыть файловый поток.
fs.Close();
На заметку! В зависимости от имеющихся у вас пользовательских разрешений и конфигурации системы примеры, которые здесь рассматриваются, могут требовать запуска Visual Studio от имени администратора.
Метод FileInfo.Create() возвращает тип FileStream, который предоставляет синхронную и асинхронную операции записи/чтения лежащего в его основе файла. Имейте в виду, что объект FileStream, возвращаемый FileInfo.Create(), открывает полный доступ по чтению и записи всем пользователям.
Также обратите внимание, что после окончания работы с текущим объектом FileStream необходимо обеспечить закрытие его дескриптора для освобождения внутренних неуправляемых ресурсов потока. Учитывая, что FileStream реализует интерфейс IDisposable, можно использовать блок using и позволить компилятору сгенерировать логику завершения (подробности ищите в главе 8):
var fileName = $@"C{Path.VolumeSeparatorChar}
{Path.DirectorySeparatorChar}Test.dat";
...
// Поместить файловый поток внутрь оператора using.
FileInfo f1 = new FileInfo(fileName);
using (FileStream fs1 = f1.Create())
{
// Использовать объект FileStream...
}
f1.Delete();
На заметку! Почти все примеры в этой главе содержат операторы using. Можно также использовать новый синтаксис объявлений using, но было решено придерживаться операторов using, чтобы сосредоточить примеры на исследуемых компонентах System.IO.
Метод FileInfо.Open()
С помощью метода FileInfo.Open() можно открывать существующие файлы, а также создавать новые файлы с более высокой точностью представления, чем обеспечивает метод FileInfo.Create(), поскольку Open() обычно принимает несколько параметров для описания общей структуры файла, с которым будет производиться работа. В результате вызова Open() возвращается объект FileStream. Взгляните на следующий код:
var fileName = $@"C{Path.VolumeSeparatorChar}
{Path.DirectorySeparatorChar}Test.dat";
...
// Создать новый файл посредством FileInfо.Open().
FileInfo f2 = new FileInfo(fileName);
using(FileStream fs2 = f2.Open(FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None))
{
// Использовать объект FileStream...
}
f2.Delete();
Эта версия перегруженного метода Open() требует передачи трех параметров. Первый параметр указывает общий тип запроса ввода-вывода (например, создать новый файл, открыть существующий файл или дописать в файл), который представлен в виде перечисления FileMode (описание его членов приведено в табл. 20.5):
public enum FileMode
{
CreateNew,
Create,
Open,
OpenOrCreate,
Truncate,
Append
}
Второй параметр метода Open() — значение перечисления FileAccess — служит для определения поведения чтения/записи лежащего в основе потока:
public enum FileAccess
{
Read,
Write,
ReadWrite
}
Наконец, третий параметр метода Open() — значение перечисления FileShare — указывает, каким образом файл может совместно использоваться другими файловыми дескрипторами:
public enum FileShare
{
None,
Read,
Write,
ReadWrite,
Delete,
Inheritable
}
Методы FileInfо.OpenRead() и FileInfо.OpenWrite()
Метод FileInfо.Open() позволяет получить дескриптор файла в гибкой манере, но класс FileInfо также предлагает методы OpenRead() и OpenWrite(). Как и можно было ожидать, указанные методы возвращают подходящим образом сконфигурированный только для чтения или только для записи объект FileStream без необходимости в предоставлении значений разных перечислений. Подобно FileInfо.Create() и FileInfо.Open() методы OpenRead() и OpenWrite() возвращают объект FileStream.
Обратите внимание, что метод OpenRead() требует, чтобы файл существовал. Следующий код создает файл и затем закрывает объект FileStream, так что он может использоваться методом OpenRead():
f3.Create().Close();
Вот полный пример:
var fileName = $@"C{Path.VolumeSeparatorChar}
{Path.DirectorySeparatorChar}Test.dat";
...
// Получить объект FileStream с правами только для чтения.
FileInfo f3 = new FileInfo(fileName);
// Перед использованием OpenRead() файл должен существовать.
f3.Create().Close();
using(FileStream readOnlyStream = f3.OpenRead())
{
// Использовать объект FileStream...
}
f3.Delete();
// Теперь получить объект FileStream с правами только для записи.
FileInfo f4 = new FileInfo(fileName);
using(FileStream writeOnlyStream = f4.OpenWrite())
{