Какое пространство имен нужно приложению для работы с файлами
Многие типы из пространства имен 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() может быть вызван перед получением информации об атрибутах, чтобы обеспечить актуальность состояния статистики о текущем файле или каталоге.
Содержание:
1. Диаграмма классов пространства имен System.IO
2. Классы
3. Структуры
4. Делегаты
5. Перечисления
1. Диаграмма класов пространства имен System.IO
Пространство имен System.IO содержит типы, позволяющие осуществлять чтение и запись в файлы и потоки данных, а также типы для базовой поддержки файлов и папок. Ниже приведено полное описание данного пространства имен, а так же основные примеры работы с ним.
System.IO включает в себя:
• BinaryReader Считывает простые типы данных как двоичные значения в заданной кодировке.
• BinaryWriter Записывает простые типы данных в поток как двоичные значения и поддерживает запись строк в определенной кодировке.
• BufferedStream Обеспечивает дополнительную буферизацию для выполнения операций чтения и записи с другими потоками.Этот класс не может быть унаследован.
• Directory Предоставляет статические методы для создания, перемещения и перечисления в каталогах и вложенных каталогах.Этот класс не может быть унаследован.
Пример использования:
Пример использования:
• DirectoryNotFoundException Исключение, возникающее при невозможности найти часть файла или каталога.
• DriveInfo Предоставляет доступ к сведениям на диске.
Пример использования:
• DriveNotFoundException Исключение вызывается при попытке доступа к недоступному диску или данным совместного использования.
• EndOfStreamException Исключение, которое создается при попытке выполнить чтение за пределами потока.
• ErrorEventArgs Предоставление данных для события Error.
• File Предоставляет статические методы для создания, копирования, удаления, перемещения и открытия файлов, а также помогает при создании объектов FileStream.
Пример использования:
• FileFormatException Исключение, которое вызывается, если входной файл или поток данных, который должен соответствовать определенной спецификации формата файла, сформирован неверно.
• FileInfo Предоставляет методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также позволяет создавать объекты FileStream.Этот класс не может быть унаследован.
Пример использования:
• FileLoadException Это исключение создается в случае, когда управляемая сборка найдена, но не может быть загружена.
• FileNotFoundException Это исключение создается, когда попытка доступа к файлу, не существующему на диске, заканчивается неудачей.
• FileStream Предоставляет Stream в файле, поддерживая синхронные и асинхронные операции чтения и записи.
• FileSystemEventArgs Предоставляет данные для событий каталога: Changed, Created, Deleted.
• FileSystemInfo Обеспечивает базовый класс для объектов FileInfo и DirectoryInfo.
• FileSystemWatcher Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.
• InternalBufferOverflowException Исключение, создаваемое при переполнении внутреннего буфера.
• InvalidDataException Исключение возникает, когда поток данных имеет недопустимый формат.
• IODescriptionAttribute Задает для визуальных конструкторов описания возможность отображения при обращении к событию, средству расширения или свойству.
• IOException Исключение, создаваемое при возникновении ошибки ввода-вывода.
• Path Выполняет операции для экземпляров класса String, содержащих сведения пути к файлу или каталогу.Эти операции выполняются межплатформенным способом.
• PathTooLongException Исключение, создаваемое, когда путь или имя файла превышает максимальную длину, определенную системой.
• PipeException Создается при ошибке в именованном канале.
• RenamedEventArgs Предоставляет данные для события Renamed.
• Stream Предоставляет универсальное представление последовательности байтов.
• StreamReader Реализует TextReader, который считывает символы из потока байтов в определенной кодировке.
Пример использования:
• StreamWriter Реализует TextWriter для записи символов в поток в определенной кодировке.
Пример использования:
• MemoryStream Создает поток, резервным хранилищем которого является память.
Пример использования:
• StringReader Реализует класс TextReader, осуществляющий чтение из строки.
Пример использования:
• StringWriter Реализует TextWriter для записи данных в строку.Данные хранятся в основном StringBuilder.
Пример использования:
• TextReader Представляет средство чтения, позволяющее считывать последовательные наборы знаков.
• TextWriter Представляет средство записи, позволяющее записывать последовательные наборы символов.Это абстрактный класс.
• UnmanagedMemoryAccessor Предоставляет произвольный доступ к неуправляемым блокам памяти из управляемого кода.
• UnmanagedMemoryStream Предоставляет доступ к неуправляемым блокам памяти из управляемого кода.
3. Структуры
• WaitForChangedResult Содержит сведения о произошедшем изменении.
4. Делегаты
• ErrorEventHandler Предоставляет метод, обрабатывающий событие Error объекта FileSystemWatcher.
• FileSystemEventHandler Представляет метод, обрабатывающий события Changed, Created или Deleted класса FileSystemWatcher.
• RenamedEventHandler Представляет метод, обрабатывающий событие Renamed класса FileSystemWatcher.
5. Перечисления
• DriveType Определяет постоянные величины для типов дисков, включая CDRom, Fixed, Network, NoRootDirectory, Ram, Removable и Unknown.
• FileAccess Определяет константы чтения, записи или чтения и записи файла.
• FileAttributes Предоставляет атрибуты для файлов и папок.
• FileMode Описывает, каким образом операционная система должна открывать файл.
• FileOptions Представляет дополнительные параметры для создания объекта FileStream.
• FileShare Содержит константы, позволяющие управлять типом доступа, который другие объекты FileStream могут осуществлять к тому же файлу.
• HandleInheritability Указывает, является ли основной дескриптор наследуемым дочерними процессами.
• NotifyFilters Задает изменения, наблюдаемые в файле или папке.
• SearchOption Указывает, следует ли выполнять поиск в текущем каталоге или в текущем каталоге и всех подкаталогах.
• SeekOrigin Предоставляет поля, представляющие точки ссылки для поиска в потоках.
• WatcherChangeTypes Возможные изменения в файле или каталоге.
Классы определены в пространстве имен System.IO и по сути являют собой расширение встроенных функций работы с файлами, определенными в mscorlib.dll. Для корректной работы приложений, использующих эти классы нужно включать пространство имен System.IO с помощью ключевого слова using следующим образом:
Назначение классов
Классы File и FileInfo рекомендуется применять, для операций с файлами общего типа, таких как:
- Создание и удаление;
- Копирование или перемещение;
- Открытие и переименование;
- Соединение двух файлов в одном;
- Изменение атрибутов файла для файловой системы.
Если необходима работа со строками и отельными символами, члены классов возвращают специальный объект для этого (например, StreamWriter).
Различие между классами
Кроется в механизме взаимодействия с ними. Так, все члены класса File – статические, поэтому он позволяет производить файловые операции без необходимости создавать объект типа. Все его методы требуют указания файлового пути, то есть адресной ссылки внутри файловой системы.
Статичность методов класса File делает его использование предпочтительным в большинстве случаев, когда файловая операция – одиночная.
Основные методы:
- Create – создает файл;
- Delete – удаляет файл;
- Copy – копирует файл;
- Move – перемещает файл;
- Exist(file_path) – проверяет существует ли файл.
Все эти методы вызываются через имя типа, как при использовании любого статического класса.
Когда существует необходимость множественных действий с конкретным файлом, то безопасней и удобней создать объектную ссылку. Такой подход заключен в классе FileInfo. Функционал этого класса заметно шире благодаря более низкому положению в иерархии наследования типов внутри System.IO.
Так, FileInfo кроме аналогичных методов класса File имеет ряд полезных свойств:
- Length – возвращает размер файла;
- Directory – возвращает ссылку на родительский каталог файла (объект типа DirectoryInfo);
- DirectoryName – возвращает строку-путь к родительской дериктории;
- Exist – проверяет существует ли файл и возвращает значение типа bool;
- Свойство Extension – возвращает расширение файла;
- Name и FullName: возвращают имя или полное имя файла.
Оба класса являются потокобезопасными, однако сохранность значений внутри объектов, которые используют классы не гарантируются.
Использование классов
При использовании классов File и FileInfo следует помнить, что оба они работают с файловыми именами и путями к файлу. Последние часто передаются через обычную строку. Если пользовательский интерфейс программы предоставляет пользователю возможность самому вводить эти пути, то в программе должен быть блок проверки строки с путем соответствия правилам.
Строка, которую используют члены классов File или FileInfo может включать себя путь к фалу или каталогу.
Примеры правильной строки:
Строка использующая путь к сетевому общему ресурсу выглядит следующим образом:
Строка с путем к файлу в неправильно введенном формате вызовет исключение.
Примеры использования
Допустим у нас есть тривиальная задача – создание файла и запись в него, разделим его на 3 этапа:
- Проверим существует ли уже такой файл.
- Если нет, то создадим его и запишем в него строку.
- Откроем созданный файл и прочитаем строку, записанную нами ранее.
Поскольку задача одиночная используем функционал класса File.
В качестве пути к файлу мы использовали строковую переменную со значением: c:\Examples\FileTestApp.txt. Прежде чем использовать этот код, необходимо, чтобы директория c:\Examples была создана. Проверить есть ли она невозможно средствами класса File, для этого используется класс Directory. Если каталога с таким именем не обнаружится, будет вызвано исключение.
В следующем примере описано использование функционала класса FileInfo.
Как видно из примера выше, использование ссылки на объект работы с фалом гораздо удобнее в случае если после записи или чтения из фала с ним нужно еще работать. Пример этой работы находится в блоке try/catch (копирование информации из файла в файл).
Поскольку любое безопасное решение обращения к файлам – это выполнение его внутри блока обработки исключений, не придется создавать для каждой одиночной операции новый блок, если есть ссылка на объект.
Чтобы определить пространство имен используется следующая конструкция:
Вложенные пространства имен
Здесь мы определили вложенное пространство имен (namespace) MyNamespace . Теперь, чтобы использовать класс Data мы должны сделать так:
то есть, перед именем класса ( Data ) мы указываем название пространства имен ( MyNamespace ).
Более предпочтительным с точки зрения читабельности и поддержки проекта является организация пространства имен непосредственно через обозреватель решений Visual Studio . По умолчанию Visual Studio создает новое пространство имен в проекте на каждую папку в проекте. Например, создадим в нашем проекте попку с именем Base:
Создадим новый класс с названием BaseClass :
Обратите внимание на то, какое имя пространству имен присвоила Visual Studio :
По умолчанию, Visual Studio создала новый класс в пространстве имен составленному по шаблону: [Имя_проекта].[Папка_с_файлом]
Аналогичным образом мы можем создать поддиректорию в папке Base и пространство имен снова будет соответствовать физическому пути на диске, например:
Физически этот интерфейс располагается по пути /Base/Interfaces/IView.cs
Глобальные пространства имен и пространства имен уровня файла
Глобальные пространства имен
Глобальные пространства имен удобно использовать в том случае, если вам необходимо использовать это пространство имен во всем (или в большинстве файлов) проекте. Например, уже используемое нами пространство имен System можно определить как глобальное. Чтобы определить глобальное пространство имен необходимо перед его объявлением использовать ключевое слово global .
Теперь нам нет необходимости в каждом файле проекта для которого необходимо использование пространства имен System использовать конструкцию using System; .
Глобальные пространства имен можно определять в любом месте проекта, однако при этом, пространство имен с параметром global всегда должно находиться в коде выше, чем пространство имен без global :
Как можно видеть на скриншоте, Visual Studio указывает нам на то, что пространство имен с global необходимо перенести ВЫШЕ. И хоть мы имеем право определить глобальное пространство в любом удобном для нас месте, все же стоит придерживаться элементарных правил хорошего тона и постараться обеспечить поддержку нашего проекта в любом обозримом будущем. Поэтому все глобальные пространства имен лучше вынести в отдельный файл и назвать этот файл наиболее подходящим образом, например, GlobalUsings.cs или GlobalNamespaces.cs :
В обозревателе решений этот файл находится на самом верхнем уровне в проекте:
Пространства имен уровня файла
Итого
Читайте также: