КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Список лекций по акушерству
Работа с классами BinaryWriter и BinaryReader Работа с классами StreamWriter и StreamReader Абстрактный класс Stream Работа с классом File Методы CreateText() и AppendText() Метод OpenText() Методы OpenRead() и OpenWrite() Метод Open() Метод Create() Работа с классом FileInfo Работа с классом DriveInfo Работа с классом Directory Создание подпапок с помощью класса DirectoryInfo Перечисление файлов с помощью класса DirectoryInfo Создание объектов класса DirectoryInfo Работа с классом DirectoryInfo Абстрактный базовый класс FileSystemInfo Работа с файлами и папками При разработке реальных приложений обязательным является хранение данных на устройствах внешней памяти для поддержки связи между сеансами работы с приложением. В библиотеку платформы.Net – FCL имеется пространство имен System.IO содержащее набор классов для работы с папками (директориями, каталогами) и файлами на внешних устройствах. В это пространство имен включены классы Directory и File, которые содержат методы для создания, удаления, копирования и перемещения папок и файлов с помощью статических методов. С этими классами тесно связаны классы FileInfo и DirectoryInfo, которые содержат аналогичную функциональность, но используют методы экземпляров класса (поэтому, для работы с ними должны быть созданы объекты этих классов с помощью операции new). Классы FileInfo и DirectoryInfo являются производными от абстрактного класса FileSystemInfo. Классы FileInfo и DirectoryInfo лучше использовать для получения всех детальных описаний файлов и папок (например, время их создания, возможности чтения/записи, и т.п.), так как методы этих классов возвращают строго типизированные объекты. А методы классов Directory и File чаще возвращают простые строковые значения, а не строго типизированные объекты. Классы DirectoryInfo и FileInfo получают много методов от абстрактного класса FileSystemInfo. Элементы класса FileSyste165 mInfo в основном используются для получения общих характеристик (таких, как время создания, различные атрибуты и т.д.) о конкретном файле или папке. Таблица 9.1. Свойства класса FileSystemInfo
В классе FileSystemInfo также определен метод Delete(), который реализуется в производных классах для удаления заданной папки или файла с внешнего устройства. А также определен метод Refresh(), вызов которого перед получением информации об атрибутах, гарантирует, что эта информация не устарела. Класс DirectoryInfo содержит набор методов для создания, перемещения, удаления и выполнения перечисления всех папок и подпапок. В данном классе к функциональности базового класса FileSystemInfo добавлены следующие основные возможности (табл. 9.2). Таблица 9.2. Основные элементы класса DirectoryInfo
Работа с классом DirectoryInfo начинается с создания объекта данного класса с помощью конструктора, параметром которого является путь к конкретной папке. Для получения объекта соответствующего текущей папке (например, директории выполняемого приложения), используйте строка ".". Например: // получение текущей рабочей папки DirectoryInfo dir1 = new DirectoryInfo("."); // получение объекта соответстующего папке C:\Windows DirectoryInfo dir2 = new DirectoryInfo(@"C:\Windows");
Если указанной папки не существует, то объект будет создан, однако при работе с ним будет выдаваться исключение System.IO.DirectoryNotFoundException. Если создан объект для не существующей папки, то нужно вызвать метод Create() прежде, чем продолжать работу с объектом: // Создаем объект для не существующей папки DirectoryInfo dir3 = new DirectoryInfo(@"C:\MyFolder"); // Затем создаем эту папку dir3.Create();
После создания объекта класса DirectoryInfo, можно выполнять работать с его содержанием, используя любые свойства, наследуемые от класса FileSystemInfo. Например, объект класса DirectoryInfo, связанный с папкой C:\Windows, позволяет получить много полезной информации о ней: DirectoryInfo dir = new DirectoryInfo(@"C:\Windows"); Console.WriteLine("FullName: {0}", dir.FullName); Console.WriteLine("Name: {0}", dir.Name); Console.WriteLine("Parent: {0}", dir.Parent); Console.WriteLine("Attributes: {0}", dir.Attributes); Для получения информации о файлах, содержащихся в папке, используется метод GetFiles(), параметром которого является маска имен нужных файлов (например, “*.*” – все файлы, “*.jpg” – файлы с расширением jpg). Данный метод возвращает массив объектов типа FileInfo, каждый из которых соответствует одному файлу, расположенному в папке. Например: DirectoryInfo dir = new DirectoryInfo(@"C:\Windows\Web\Wallpaper"); // Получить все файлы с расширением *.jpg FileInfo[] imageFiles = dir.GetFiles("*.jpg"); // Сколько файлов было найдено? Console.WriteLine("Found {0} *.jpg files\n", imageFiles.Length); // Вывод на экран информацию о каждом файле. foreach (FileInfo f in imageFiles) { Console.WriteLine("File name: {0}", f.Name); Console.WriteLine("File size: {0}", f.Length); } Для создания новых подпапок в текущей папке используется метода CreateSubdirectory(). При одном вызове этого метод за один раз создается одна или несколько вложенных подпапок. Например, для создания подпапки с именем MyFolder: DirectoryInfo dir = new DirectoryInfo("."); // создаем поддиректорию \MyFolder DirectoryInfo myDataFolder = dir.CreateSubdirectory("MyFolder"); // Создаем две вложенных поддиректории dir.CreateSubdirectory(@"MyFolder2\Data");
Результатом работы метода CreateSubdirectory() является ссылка на объект класса DirectoryInfo, который соответствует созданной подпапке. Возможности класса Directory во много аналогичны возможностям класса DirectoryInfo. Однако класс Directory является статическим классом и не позволяет создавать объекты, а только позволяет вызывать его методы. Кроме этого отметим, что элементы Directory обычно возвращают строки (string), а не объекты конкретных типов, таких, как FileInfo или DirectoryInfo. В примере приведенном ниже показано использование класса Directory для вывода не экран название всех устройств компьютера (с помощью статического метода GetLogicalDrives()) и для удаления ранее созданной папки с именем \MyFolder помощью статического метода Delete():
// Перечисление всех драйверов компьютера string[] drives = Directory.GetLogicalDrives(); Console.WriteLine("Драйверы компьютера:"); foreach (string s in drives) Console.WriteLine("--> {0} ", s); // Удаление папки С:\MyFolder try {Directory.Delete(string.Format(@"C:\MyFolder"));} catch (IOException e) { Console.WriteLine(e.Message); } В пространстве имен System.IO содержится класс с именем DriveInfo. Так же, как и Directory.GetLogicalDrives(), статический метод DriveInfo.GetDrives() позволяет получить имена драйверов компьютера. Однако в отличие от Directory.GetLogicalDrives(), DriveInfo предоставляет множество других данных (такие как тип драйвера, свободное место, метки тома и т.п.). Рассмотри следующий пример: // Получение информации обо всех драйверах DriveInfo[] myDrives = DriveInfo.GetDrives(); // Вывод на экран их данных foreach(DriveInfo d in myDrives) { Console.WriteLine("Имя: {0}", d.Name); Console.WriteLine("Тип: {0}", d.DriveType); // проверка, смонтирован ли драйвер if (d.IsReady) { Console.WriteLine("Свободное место: {0}", d.TotalFreeSpace); Console.WriteLine("Формат: {0}", d.DriveFormat); Console.WriteLine("Метка: {0}", d.VolumeLabel); Console.WriteLine(); } } Класс FileInfo позволяет получать описания файлов, имеющихся на внешнем устройстве (например, время создания, размер, атрибуты файлов и т.д.) и помогает создавать, копировать, перемещать и уничтожать файлы. Класс FileInfo, помимо возможностей базового класса FileSystemInfo, включает набор собственных элементов (табл. 9.3). Отметим, что большинство методов класса FileInfo возвращают объекты конкретных классов (FileStream, StreamWriter и т.п.), которые позволяют выполнять чтение/запись данных разных форматов из (или в) связанный с ними файл. Таблица 9.3. Основные элементы класса FileInfo
Метод Create()класса FileInfo является основным методом для создания новых файлов. Он возвращает ссылку на объект типа FileStream, который умеет выполнять операции чтения/записи для созданного файла. После окончания работы с объектом FileStream, необходимо выполнить закрытие данного объекта (потока), для освобождения ресурса: // Создаем новый файл на устройстве C FileInfo f = new FileInfo(@"C:\Test.dat"); FileStream fs = f.Create(); //... выполняем работу с новым файлом // Закрываем поток файла fs.Close(); Для открытия существующего файла или создания нового файла можно использовать метод Open() класса FileInfo. Метод Open() позволяет более точно описать создаваемый файл, чем метод Create(). Результатом выполнения метода Open(), является ссылка на объект класса FileStream: // Создаем новый файл с помощью метода Open() FileInfo f2 = new FileInfo(@"C:\Test2.dat"); FileStream fs2 = f2.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); //... fs2.Close();
Имеются несколько перегруженных методов Open(). Основной вариант данного метода принимает три параметра. Первый параметр описывает общую информацию об открытии файла (например, создание нового файла, открытие существующего файла, добавление данных в конец файла, и т.п.), что задается с помощью перечисления FileMode (табл. 9.4): public enum FileMode {CreateNew, Create, Open, OpenOrCreate, Truncate, Append} Таблица 9.4. Элементы перечисления FileMode
Вторым параметром является значение перечисления FileAccess, который определяет виды выполняемых операций ввода/вывода: public enum FileAccess { Read, Write, ReadWrite }
И, наконец, третий параметр, FileShare, задает режим совместной работы с данным файлом разными приложениями: public enum FileShare { None, Read, Write, ReadWrite }
Метод Open() позволяет очень подробно описать режим работы с файлом и получит ссылку на объект класса FileStream. Однако в классе FileInfo также имеются методы OpenRead() и OpenWrite(), которые позволяют получить ссылку на объект класса FileStream, настроенные только на чтение и запись (соответственно), без необходимости описывать различные параметры. Например:
// Получить ссылку FileStream для чтения из файла FileInfo f3 = new FileInfo(@"C:\Test3.dat"); FileStream readOnlyStream = f3.OpenRead(); //... использование объекта FileStream readOnlyStream.Close(); // теперь получаем объект FileStream для записи FileInfo f4 = new FileInfo(@"C:\Test4.dat"); FileStream writeOnlyStream = f4.OpenWrite(); //... использование объекта FileStream writeOnlyStream.Close(); Другим методом класса FileInfo предназначенным для открытия файла является метод OpenText(). В отличие от методов Create(), Open(), OpenRead()и OpenWrite(), метод OpenText() возвращает ссылку на объект класса StreamReader, а не класса FileStream. Класс StreamReader предоставляет возможность читать текстовые данные из файла. Например: // Получаем ссылку на объект класса StreamReader FileInfo f5 = new FileInfo(@"C:\boot.ini"); StreamReader sreader = f5.OpenText(); //... использование объекта StreamReader sreader.Close(); Методы CreateText() и AppendText() возвращают ссылку на объекты класса StreamWriter. Класса StreamWriter предоставляет возможности для записи текстовых данных в файл. Метод CreateText() позволяет создать новый файл и возвращает ссылку на объект, позволяющую выполнять запись текстовых данных в новый файл. А метод AppendText()возвращает ссылку на объект, позволяющую выполнять запись текстовых данных в конец существующего файла. Например: FileInfo f6 = new FileInfo(@"C:\Test5.txt"); StreamWriter swriter = f6.CreateText(); //... использование объекта StreamWriter swriter.Close(); FileInfo f7 = new FileInfo(@"C:\FinTst.txt"); StreamWriter swAppend = f7.AppendText(); //... использование объекта StreamWriter swAppend.Close(); Класс File предоставляет почти те же возможности, которые есть в классе FileInfo, но использует для этого статические методы. Так же как и класс FileInfo, класс File предоставляет методы AppendText(), Create(), CreateText(), Open(), OpenRead(), OpenWrite() и OpenText(). Фактически, во многих случаях, классы File и FileInfo могут использоваться взаимозаменяемо. В качестве демонстрации, можно приведенные ранее примеры для класса FileStream переписать с использованием класса File: // Получаем объект FileStream с помощью File.Create(). FileStream fs = File.Create(@"C:\Test.dat"); // Получаем объект FileStream с помощью File.Open(). FileStream fs2 = File.Open(@"C:\Test2.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); // Получаем объект FileStream только для чтения FileStream readOnlyStream = File.OpenRead(@"Test3.dat"); // Получаем объект FileStream только для записи FileStream writeOnlyStream = File.OpenWrite(@"Test4.dat"); // Получаем объект StreamReader StreamReader sreader = File.OpenText(@"C:\boot.ini"); // Получаем объект StreamReader для нового файла StreamWriter swriter = File.CreateText(@"C:\Test3.txt"); // Получаем объект StreamReader для добавления текста StreamWriter swAppend = File.AppendText(@"C:\FinTst.txt"); Дополнительные методы класса File Класс File также поддерживает несколько специальных методов, которые поясняются в табл. 9.5, которые значительно упрощают процесс чтения и записи текстовых данных. Использование этих методов класса File позволяет читать и записывать порцию данных с помощью нескольких операторов.
Таблица 9.5. Методы класса File
Например, в следующем примере символьные данные записываются в новый файл: string[] myTasks = {"Перевести текст","Позвонить маме"}; // Запись всех данных в файл. File.WriteAllLines(@"C:\tasks.txt", myTasks); // Чтение всех записанных данных и вывод их на экран foreach (string task in File.ReadAllLines(@"C:\tasks.txt")) Console.WriteLine("Нужно сделать: {0}", task);
Рис. 9.1. Классы производные от класса Stream.
Для того, чтобы не только получать информацию о файлах и выполнять с ним разные операции (например, создание, копирование, перемещение и удаление), а также читать или записывать данные в файлы, используется понятие «поток» (stream). В области ввода/вывода данных, поток представляется виде порции данных передаваемых между источником и получателем. Потоки предоставляют общий способ взаимодействия с последовательностью байт, независимо от того, какой тип устройства (файл, сетевое соединение, принтер и т.п.) хранит или отображает эти байты. Абстрактный класс System.IO.Stream определяет набор элементов, предоставляющих поддержку разных типов взаимодействия с устройствами хранения данных (например, некоторый файл или участок памяти). Классы, производные от абстрактного базового класса Stream (рис. 9.1) представляют данные в виде необработанного потока байт, поэтому работа напрямую с ними достаточно трудоемка. Некоторые классы производные от Stream поддерживают поиск, т.е. выполняют определение и изменение текущей позиции в потоке. Основные элементы класса Stream, показаны в табл. 9.6.
Таблица 9.6. Элементы класса Stream
Для работы с файлами на основе абстрактного класса Stream реализован класс FileStream, который определяет методы наиболее подходящие для работы с файлами. Это достаточно простой поток, который может только читать и писать один или массив байт. При составлении программ этот класс используется редко, чаще используются различные потоки, основанные на классе FileStream, такие как StreamWriter и StreamReader для работы с текстовыми данными, а также BinaryWriter и BinaryReader для работы с бинарными данными. Классы StreamWriter и StreamReader используются для чтения и записи символьных данных (например, строк – string). Оба эти класса по умолчанию работают с системой кодировки символов Unicode; однако, можно изменить систему кодировки с помощью задания правильно сконфигурированного объекта класса System. Text.Encoding. Класс StreamWriter является производным от абстрактного класса TextWriter, основные элементы которого описаны в табл.9.7. Таблица 9.7. Основные элементы класса TextWriter
В классе StreamWriter переопределены разные методы базового класса, в том числе и метод Write(). В примере, приведенном ниже, создается новый файл с именем reminders.txt с помощью метода File.CreateText(). Используя метод Write()полученного объекта StreamWriter в новый файл добавляются текстовые данные: StreamWriter writer = File.CreateText(@"c:\reminders.txt"); writer.WriteLine("Не забудь cделать перевод."); writer.WriteLine("Не забудь позвонить маме."); for(int i = 0; i < 5; i++) writer.Write(i + " "); // вставляем символ новой строки writer.Write(writer.NewLine);
Класс StreamReader (так же, как и связанный с ним класс StringReader, рассмотренный ниже) является производным от класса от абстрактного класса TextReader, основные элементы которого описаны в табл. 9.8.
Таблица 9.8. Основные элементы класса TextReader
Для чтения данных из файла с помощью объектов класса StreamReader, который является производным от класса TextReader, используется переопределенный метод ReadLine(): StreamReader sr = File.OpenText(@"c:\reminders.txt"); string input = null; while ((input = sr.ReadLine())!= null) Console.WriteLine (input); Результат: Не забудь cделать перевод. Не забудь позвонить маме. 1 2 3 4 5 Для записи и чтения данных в бинарном (не текстовом) формате используются классы BinaryReader и BinaryWriter. Таблица 9.9. Основные элементы класса BinaryWriter
Класс BinaryWriter определяет имеющий большое количество вариантов (сильно перегруженный) метод Write() для записи типов данных базовый поток. Кроме метода Write(), BinaryWriter содержит дополнительные элементы, которые описаны в табл. 9.9. Следующий пример записывает набор данных разных типов в новый файл:
//открываем бинарный writer для файла. FileInfo f = new FileInfo(@"C:\BinFile.dat"); BinaryWriter bw = new BinaryWriter(f.OpenWrite()); // выводим на экран тип объекта BaseStream. Console.WriteLine("Base stream is: {0}",bw.BaseStream); // создаем некоторые данные для сохранения в файле double aDouble = 1234.67; int anInt = 34567; string aString = "A, B, C"; // записывем данные в файл bw.Write(aDouble); bw.Write(anInt); bw.Write(aString);
Отметим, что объект FileStream полученный из метода OpenWrite()передается конструктору класса BinaryWriter. Конструктор BinaryWriter принимает объект любого класса, производного от Stream (например, FileStream, MemoryStream и т.п.). Таким образом, если требуется хранить данные в оперативной памяти, то нужно просто передать правильный объект типа MemoryStream. Класс BinaryReader дополняет функциональность предлагаемую классом BinaryWriter. Основные элементы этого класса описаны в табл. 9.10. Таблица 9.10. Основные элементы класса BinaryReader
Например, для чтения данных из файла BinFile.dat можно выполнить следующим образом: FileInfo f = new FileInfo(@"C:\BinFile.dat"); ... // Чтение данных из бинарного файла BinaryReader br = new BinaryReader(f.OpenRead()); Console.WriteLine(br.ReadDouble()); Console.WriteLine(br.ReadInt32()); Console.WriteLine(br.ReadString());
IV курс педиатрического факультета
Дата добавления: 2014-01-07; Просмотров: 290; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |