Работа с файлами и потоками данныхКлассы Directory, File, DirectoryInfo и FileInfo предназначены для работы с каталогами и файлами. Первые два класса выполняют операции при помощи статических методов, вторые два – при помощи экземплярных методов.
var dir = new DirectoryInfo(@"C:\Temp");
Класс DirectoryInfo обладает двумя наборами методов для получения до- черних подкаталогов, файлов или объектов FileSystemInfo. Методы вида GetЭлементы() выполняются немедленно и возвращают массив. FileInfo[] f = dir.GetFiles("*.txt", SearchOption.AllDirectories);//из всех подкаталогов Класс FileInfo описывает файл на диске и позволяет производить операции с этим файлом. Как правило, код, работающий с данными файла, вначале вызывает метод Open(). Параметр FileMode определяет режим запроса на открытие файла. Для него используются значения из перечисления
Append – открывает файл, если он существует, и ищет конец файла. Если файл не существует, то он создаётся.
Create – указывает на создание нового файла. Если файл существует, он будет перезаписан;
CreateNew – указывает на создание нового файла. Если файл существует,
генерирует исключение IOException;
Open – операционная система должна открыть существующий файл;
OpenOrCreate – операционная система должна открыть существующий файл или создать новый, если файл не существует;
Второй параметр метода Open() – FileAccess -доступ к файлу.
Read – файл будет открыт только для чтения;
ReadWrite – файл будет открыт и для чтения, и для записи;
Write – файл открывается только для записи, то есть добавления данных.
Поток данных – это абстрактное представление данных в виде последовательности байтов. Поток либо ассоциируется с неким физическим хранилищем (файлами на диске, памятью, сетью), либо декорирует (обрамляет) другой поток, преобразуя данные тем или иным образом.
Адаптеры потоков служат оболочкой потока, преобразуя информацию определённого формата в набор байтов (сами адаптеры потоками не являются).
1. Абстрактный класс System.IO.Stream. Это базовый класс для других классов, представляющих потоки.
2. Классы для работы с потоками, связанными с хранилищами. FileStream – класс для работы с файлами, как с потоками (пространство имён System.IO).
3. Декораторы потоков. DeflateStream и GZipStream – классы для потоков со сжатием данных (пространство имён System.IO.Compression).
4. Адаптеры потоков. BinaryReader и BinaryWriter – классы для ввода и вывода примитивных типов в двоичном формате. StreamReader и StreamWriter – классы для ввода и вывода информации в строковом представлении. XmlReader и XmlWriter – абстрактные классы для ввода/вывода XML.
XAML, разметка, расширения разметкиРасширяемый язык разметки приложений (eXtensible Application Markup Language, XAML) – это язык для представления дерева объектов .NET, основанный на XML. Данные XAML превращаются в дерево объектов при помощи анализатора XAML (XAML parser). Основное назначение XAML – описание пользовательских интерфейсов в приложениях WPF и Silverlight.
Рассмотрим основные правила XAML. Документ XAML записан в формате XML. Это означает, что имена элементов XAML чувствительны к регистру, нужна правильная вложенность элементов, а некоторые символы требуют особого обозначения. Объектные элементы XAML описывают объект некоторого типа платформы .NET и задают значения открытых свойств и полей объекта. Имя элемента указывает на тип объекта.
<Button Width="100"><!-- определение объекта в XAML -->
I am a Button
</Button>
Для установки значений свойств объекта в XAML можно использовать атрибуты XML, элементы свойств и содержимое элемента. При использовании атрибутов указывается имя свойства и значение свойства в виде строки:
<Button Background="Red" /><!-- задаём у кнопки красный фон -->
Элемент свойства вложен в объектный элемент и имеет вид <имя-типа.имя-свойства>. Содержимое элемента свойства рассматривается как значение свойства (при необходимости применяются конвертеры). Обычно элементы свойств используются для значений, являющихся объектами.
<Button>
<Button.Width>100</Button.Width>
<Button.Background>Red</Button.Background>
</Button>
Если тип реализует интерфейсы IList или IDictionary, при описании объекта этого типа в XAML дочерние элементы автоматически добавляются в соответствующую коллекцию. Например, свойство Items класса ListBox имеет тип ItemCollection, а этот класс реализует интерфейс IList
<ListBox>
<ListBoxItem Content="Item 1" />
<ListBoxItem Content="Item 2" />
</ListBox>
Расширение разметки (markup extension) — специализированный синтаксис, устанавливающий свойство нестандартным образом.
Подмножество ключевых слов XAML (таких как х:Array, x:Null, x:Static, х:Type) — это именно расширения разметки.
<Элемент УстанавливаемоеСвойство = "{РасширениеРазметки}"/>
<StackPanel>
<Button Content="{local:ShowTime}" />
<Button Content="{local:ShowTime Header=Time}" />
</StackPanel>
Рассмотрим некоторые директивы анализатора XAML, применяемые в WPF. Анализатор генерирует код, выполняющий по документу XAML создание и настройку объектов. Действия с объектами (в частности, обработчики событий) обычно описываются в отдельном классе. Чтобы связать этот класс с документом XAML используется директива-атрибут x:Class. Этот атрибут применяется только к корневому элементу и содержит имя класса, являющегося наследником класса корневого элемента:
<!-- у корневого элемента Window задан атрибут x:Class -->
<Window x:Class="WpfApplication.MainWindow"
Чтобы сослаться на объект в коде, этот объект должен иметь имя. Для указания имени объекта используется директива-атрибут x:Name:
<Button x:Name="btn" Content="Click me!" />
Существует возможность встроить фрагмент кода в XAML-файл. Для этого используется директива-элемент x:Code. Такой элемент должен быть непосредственно вложен в корневой элемент, у которого имеется атрибут
x:Class.
Директива-атрибут x:Key применяется при описании дочерних элементов объекта-словаря, и позволяет указать ключ словаря для элемента:
<Window.Resources>
<SolidColorBrush x:Key="borderBrush" Color="Red" />
<SolidColorBrush x:Key="textBrush" Color="Black" />
</Window.Resources>