Пространство имен System.IO
30C# и .NET --- Многопоточность и файлы --- Пространство имен System.IO
Пространство имен System.IO в .NET — это область библиотек базовых классов, посвященная службам файлового ввода-вывода, а также ввода-вывода из памяти. Подобно любому пространству имен, в System.IO определен набор классов, интерфейсов, перечислений, структур и делегатов, большинство из которых находятся в mscorlib.dll. В дополнение к типам, содержащимся внутри mscorlib.dll, в сборке System.dll определены дополнительные члены пространства имен System.IO. Обратите внимание, что все проекты Visual Studio 2010 автоматически устанавливают ссылки на обе сборки.
Многие типы из пространства имен System.IO сосредоточены на программных манипуляциях физическими каталогами и файлами. Дополнительные типы предоставляют поддержку чтения и записи данных в строковые буферы, а также области памяти. Ниже кратко описаны основные (неабстрактные) классы, которые дают понятие о функциональности System.IO:
- BinaryReader, BinaryWriter
Эти классы позволяют сохранять и извлекать элементарные типы данных (целочисленные, булевские, строковые и т.п.) в двоичном виде
- BufferedStream
Этот класс предоставляет временное хранилище для потока байтов, которые могут затем быть перенесены в постоянные хранилища
- Directory, DirectoryInfo
Эти классы используются для манипуляций структурой каталогов машины. Тип Directory представляет функциональность, используя статические члены. Тип DirectoryInfo обеспечивает аналогичную функциональность через действительную объектную ссылку
- DriveInfo
Этот класс предоставляет детальную информацию относительно дисковых устройств, используемых данной машиной
- File, FileInfo
Эти классы служат для манипуляций множеством файлов данной машины. Тип File представляет функциональность через статические члены. Тип FileInfo обеспечивает аналогичную функциональность через действительную объектную ссылку
- FileStream
Этот класс обеспечивает произвольный доступ к файлу (т.е. возможности поиска) с данными, представленными в виде потока байт
- FileSystemWatcher
Этот класс позволяет отслеживать модификации внешних файлов в определенном каталоге
- MemoryStream
Этот класс обеспечивает произвольный доступ к данным, хранящимся в памяти, а не в физическом файле
- Path
Этот класс выполняет операции над типами System.String, содержащими информацию о пути к файлу или каталогу в независимой от платформы манере
- StreamWriter, StreamReader
Эти классы используются для хранения (и извлечения) текстовой информации из файла. Эти классы не поддерживают произвольного доступа к файлу
- StringWriter, StringReader
Подобно классам StreamWriter/StreamReader, эти классы также работают с текстовой информацией. Однако лежащим в основе хранилищем является строковый буфер, а не физический файл
В дополнение к этим конкретным типам классов в System.IO определено несколько перечислений, а также набор абстрактных классов (т.е. Stream, TextReader и TextWriter), которые определяют разделяемый полиморфный интерфейс для всех наследников.
Как не трудно было заметить в приведенном выше списке, для представления файлов и папок используются по два класса. Какой из них применять — во многом зависит от того, сколько раз требуется получить доступ к данной папке или файлу.
Классы Directory и File содержат только статические методы, а их экземпляры никогда не создаются. Для их использования нужно просто предоставить путь к интересующему объекту файловой системы при каждом вызове метода-члена. Если требуется выполнить только одну операцию в отношении папки или файла, то применение этих классов является наиболее эффективным подходом, поскольку позволяет избегать накладных расходов, связанных с созданием экземпляров.
Классы DirectoryInfo и FileInfo реализуют практически те же общедоступные методы, что и Directory и File, а также некоторые общедоступные свойства и конструкторы, но поддерживают состояние, а их члены не являются статическими.
Сначала понадобится создать их экземпляр, который затем ассоциировать с определенной папкой или файлом. Это означает, что применение этих классов будет более эффективным подходом, если необходимо выполнять множество операций в отношении одного и того же объекта. Дело в том, что во время создания они считывают информацию об аутентификации и прочие сведения о соответствующем объекте файловой системы и больше не нуждаются в ее повторном чтении, сколько бы методов не вызывалось для данного объекта (экземпляра класса). В отличие от этого, классы, не поддерживающие состояние, нуждаются в проверке деталей, связанных с файлом или папкой, при каждом вызове какого-либо метода.
Обратите внимание на рисунке, что классы Directory и File непосредственно расширяют System.Object, в то время как DirectoryInfo и FileInfo наследуются от абстрактного класса FileSystemInfo:
Классы DirectoryInfo и FileInfo унаследовали значительную часть своего поведения от абстрактного базового класса FileSystemInfo. По большей части члены класса FileSystemInfo используются для получения общих характеристик (таких как время создания, различные атрибуты и т.д.) определенного файла или каталога. В таблице ниже перечислены некоторые основные свойства, представляющие интерес:
Свойство | Назначение |
Attributes | Получает или устанавливает ассоциированные с текущим файлом атрибуты, которые представлены перечислением FileAttributes (доступный только для чтения, зашифрованный, скрытый или сжатый) |
CreationTime | Получает или устанавливает время создания текущего файла или каталога |
Exists | Может использоваться для определения, существует ли данный файл или каталог |
Extension | Извлекает расширение файла |
FullName | Получает полный путь к файлу или каталогу |
LastAccessTime | Получает или устанавливает время последнего доступа к текущему файлу или каталогу |
LastWriteTime | Получает или устанавливает время последней записи в текущий файл или каталог |
Name | Получает имя текущего файла или каталога |
В классе FileSystemInfo также определен метод Delete(). Этот метод реализуется производными типами для удаления файла или каталога с жесткого диска. Кроме того, метод Refresh() может быть вызван перед получением информации об атрибутах, чтобы обеспечить актуальность состояния статистики о текущем файле или каталоге.