Working with files

Download Report

Transcript Working with files

Высокоуровневые методы информатики и программирования Лекция 18 Работа с файлами

План работы • Типы файлов • Класс FileStream • Классы StreamReader и StreamWriter • Классы BynaryReader и BynaryWriter • Класс FileSystemWatcher • Сериализация

Файлы и потоки

• Файл – поименованные данные, хранящиеся на диске (кроме имени еще задается путь).

• Поток – это сущность, допускающая операции чтения и записи. При открытии для чтения/записи файл становится потоком. Потоки это не только открытые файлы. Данные, получаемые по сети, являются потоком, кроме того, поток можно создать в памяти. В консольных приложениях, клавиатурный ввод и текстовый вывод – тоже потоки.

Типы файлов

текстовые

– содержат коды символов алфавита; последовательности символов разделены на строки специальными невидимыми символами: – код возврат каретки - 13 (Carriage return) – код перевод строки - 10 (Line feed) – или вместе 13 и 10 •

двоичные

т.п.).

(бинарные) – содержат любую последовательность двоичных чисел (данные во внутреннем формате, рисунки, аудио и

Классы для работы с содержанием файлов

• Пространство имен System.IO

• FileStream – б азовый класс (файловый поток) позволяет побайтно читать/записывать содержание файла; • StreamReader / StreamWriter – классы для ввода / вывода текстовых данных (читают/записывают символы в текстовые файлы); • BinaryReader / BinaryWriter файлы) – классы для ввода вывода двоичных данных (читают/записывают данные в двоичном формате в бинарные

Работа с потоком файла

• Полное имя - System.IO.FileStream

• Позволяет открывать и выполнять работу с содержанием файла • Позволяет только побайтную работу с файлом (считать байт, записать байт) • В C# нет простых средств для преобразования массива байтов в другие типы данных.

• Имеет 5 конструкторов FileStream (flName, FileMode fm) FileStream (flName, FileMode fm, FileAccess fa)

Работа с содержанием файла с помощью класса FileStream

• Создание файла

// Создаем новый файл на диске C

FileInfo f = new FileInfo(@"C:\Test.dat"); // создаем файл и получаем доступ к потоку FileStream fs = f.Create();

// используем объект FileStream object . . . // закрываем поток

fs.Close(); • Открытие файла

// создаем новый файл с помощью FileInfo.Open()

FileInfo f2 = new FileInfo(@"C:\Test2.dat"); FileStream fs2 = f2.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); // Use the FileStream object...

Параметры открытия файла

• Перечисление режимов открытия файла: public enum FileMode { CreateNew, Create, Open, OpenOrCreate, Truncate, Append } • Перечисление виды выполняемых операций ввода/вывода: public enum FileAccess { Read, Write, ReadWrite } • Перечисление режимов совместной работы с файлом: public enum FileShare { None, Read, Write, ReadWrite }

Перечисление FileMode

CreateNew

1 Ошибка если файл существует

Create Open

2 3 Если файл существует, то его содержимое удаляется Ошибка если файл не существует

OpenOrCreate

4 Если файл не существует, то он создается

Truncate Append

5 Ошибка если файл не существует; содержимое удаляется 6 Ошибка если файл открывается на чтение; если файла нет, то он создается; указатель устанавливается на конец файла

Перечисление FileAccess

Read Write ReadWrite 1 2 Ошибка при использовании FileMode.CreateNew, FileMode.Create, FileMode.Truncate, FileMode.Append

Ошибка, если файл имеет атрибут «только для чтения» 3 Ошибка при использовании FileMode.Append

или файл имеет атрибут «только для чтения»

Перечисление FileShare

• None • Read • Write • Delete – не разрешается совместно использовать текущий файл. Любому запросу к открытому файлу (в текущем процессе или другом процессе) будет отказано до тех пор, пока файл не закроется. – разрешается последующее открытие файла на чтение. на запись. • ReadWrite - разрешается последующее открытие файла на чтение и запись. разрешается последующее открытие файла разрешается последующее удаление файла.

Методы класса FileStream

• int ReadByte() - читать следующий байт; • int Read(byte[] buf, int offset, int iCount) - читать участок файла; • void WriteByte(byte val) байт; – записать следующий • void Write(byte[] buf, int offset, int iCount) – записать массив байтов; • long seek (long offset, SeekOrigin so) выполнить поиск в файле; • void Flush() – записать содержание буфера в файл; • void Close() – закрыть файл.

Взаимосвязь между классами

Абстрактный класс для последовательности байтов Поток Stream Поток файла FileStream Классы для работы с текстовыми файлами Используется для создания TextWriter TextReader Для чтения данных StreamWriter Для записи данных StreamReader Класс для работы с содержанием файла, как с потоком Используется для создания Классы для работы с двоичными файлами Для чтения данных BinaryWriter Для записи данных BinaryReader

Последовательность работы с файлом

• создаем объект FileInfo – fi; • с помощью fi (или с помощью класса File ) создаем объект класса FileStream - fs.

• с помощью fs создаем объект класса – StreamReader файла); / StreamWriter ( объекты этих классов можно сосздать и с помощью имени – BinaryReader / BinaryWriter ; • после окончания работы с fs нужно вызвать метод Close( ).

Методы классов File/FileInfo для создания объектов, работающих с содержанием

• Создание объектов класса FileStream : – Create() – создание файла и получение экземпляра класса FileStream ввода.

– Open() – создание экземпляра класса FileStream с различными параметрами по read/write – OpenRead() – создание экземпляра класса FileStream для только для чтения (read-only) – OpenWrite() – создание экземпляра класса FileStream (write-only).

только для записи • Создание объектов класса StreamReader/ StreamWriter : – CreateText() – создание экземпляра класса StreamWriter , для записи в текущий файла.

– OpenText() – создание экземпляра класса StreamReader , для чтения из текущего файла.

– AppendText() – создание экземпляра класса StreamWriter , для добавления в конец содержания текущего файла.

Примеры

• • Пример создания объектов класса FileStream : – Получаем объект 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 / StreamWriter : – Получаем объект StreamReader StreamReader sreader = File.OpenText(@"C:\boot.ini"); – Получаем объект StreamReader для нового файла StreamWriter swriter = File.CreateText(@"C:\Test3.txt"); – Получаем объект StreamReader для добавления текста StreamWriter swAppend = File.AppendText(@"C:\FinTst.txt");

Получение объектов FileStream помощью объектов FileInfo с

// Получить ссылку 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(); // Получаем ссылку на объект класса StreamReader FileInfo f5 = new FileInfo(@"C:\boot.ini"); StreamReader sreader = f5.OpenText(); // . . . использование объекта StreamReader sreader.Close(); // Получаем ссылку на новый файл 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();

Конструкторы классов

• Класс StreamWriter – StreamWriter(Stream FileStream) – StreamWriter(Stream FileStream, Encoding enc) – StreamWriter(string FileName) – StreamWriter(string FileName, bool bAppend) – StreamWriter (string FileName, bool bAppend, Encoding enc) • Класс StreamReader – StreamReader(Stream FileStream) – StreamReader(Stream FileStream, Encoding enc) – StreamReader(string FileName) – StreamReader(string FileName, Encoding enc)

Пример записи в текстовый файл

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 sr = File.OpenText(@"c:\reminders.txt"); string input = null; while ((input = sr.ReadLine()) != null) Console.WriteLine (input); • Результат: Не забудь cделать перевод.

Не забудь позвонить маме.

0 1 2 3 4 5

Пример создания и работы с файлом

FileStream fs = new FileStream ("c:\\TestFile.txt",FileMode.Create); StreamWriter sw = new StreamWriter(fs); // записываем целое число sw.Write(15); // закрываем файл sw.Close();

Пример использования объекта StreamReader

StreamReader sr; sr = new StreamReader(@"C:\aaa.txt"); string sLine; do sLine = sr.ReadLine(); while (sLine != null); sr.Close();

Двоичные (бинарные) файлы

• Хранят обычно числовые данные во внутреннем формате (так, как они хранятся в оперативной памяти).

• Конструкторы используют объекта FileStream – BynaryWriter (Stream st) – Bynary Reader (Stream st) • Например: FileStream fs = new FileStream("c:\\TestFile.myfile", FileMode.Create); BinaryWriter bw = new BinaryWriter(fs);

Основные методы для работы с бинарными файлами

• Методы класса System.IO.BynaryWriter

– void Write(…) – методы для записи значений данного в файл, 18 перегруженных методов; – void Write(char[ ] achBuffer, int begin, int number) ; методы для записи массива данных в файл; – Seek(long offset, SeekOrigin origin) – переход на заданную позицию в файле; – void Flush() – запись из буффера в файл; – void Close() – закрытие файла.

• Методы класса System.IO.BynaryReader

– Read<тип>() – метод для чтения одного значения из файла; – Read<тип>s(int n) файла; – void Close() – метод для чтения массива значений из

//открываем бинарный 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);

Методы Read() класса BinaryReader

• bool ReadBoolean() – чтение логического значения; • char ReadChar() – чтение значения типа char; • string ReadString() – чтение строки; • int ReadInt16() (Int32, Int64) – чтение целых значений (двух байтного – short; четырех байтного – int; 8 байтного - long); • float ReadSingle() – чтение значения с плавающей точкой float; • double ReadDouble() – чтение значения с плавающей точкой doulble; • decimal ReadDecimal() – чтение десятичного значения decimal; • . . .

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());

Класс для наблюдением за происходящими изменениями в файловой системе FileSystemWatcher

Класс FileSystemWatcher

• • • • Конструктор: FileSystemWatcher(); Свойства: – Path задает каталог за которым наблюдаем watcher.Path = @”C:\Test”; – Filter задает шаблон файлов, за которыми выполняется наблюдение watcher.Filter = "*.txt"; – NotifyFilter задает список событий, за которыми выполняется наблюдение watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName

; Событие – изменение заданных атрибутов файлов в каталоге: watcher.Changed += new FileSystemEventHandler(OnChanged); Запуск наблюдения за событиями watcher.EnableRaisingEvents = true;

Перечисление NotifyFilters

Типы событий за которыми требуется наблюдать: Имя

Attributes CreationTime DirectoryName FileName LastAccess LastWrite Security Size

Изменения описаний Атрибуты файла или папки Время создания файла или папки Имя папки Имя файла Дата последнего открытия файла или папки Дата последней записи в файл или папку Изменения установок безопасности или папки Изменение размера файла или папки

Примеры использования FileSystemWatcher

• Создание объекта: FileSystemWatcher watcher = new FileSystemWatcher(); • Задаем путь к каталогу за которым наблюдаем watcher.Path = @”C:\Test”; • Задаем шаблон файлов, за которыми выполняется наблюдение watcher.Filter = "*.txt"; • Задаем список событий, за которыми выполняется наблюдение watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName

; • Задаем обработчики событий: watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created

+= new FileSystemEventHandler(OnChanged); watcher.Deleted

+= new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); • Запуск наблюдения за событиями watcher.EnableRaisingEvents = true;

Класс FileSystemEventArgs • Данные о событиях в файлах папки • Свойства

– ChangeType – тип произошедшего события ( из перечисления WatcherChangeTypes) – FullPath – полный путь к измененному файлу или папке – Name – имя измененного файла или папки

Перечисление WatcherChangeTypes

Типы событий, которые произошли в наблюдаемой папке: Имя

All Changed Created Deleted Renamed

Описание Создание, удаление, изменение или переименование файла или папки Изменение файла или папки. Тип изменения включает: изменение размера, атрибутов, установок безопасности, последней записи, и времени последнего доступа.

Создание файла или папки.

Удаление файла или папки.

Переименование файла или папки.

Пример обработчика события

} { private static void OnChanged(object source, FileSystemEventArgs e) { switch (e.ChangeType) case WatcherChangeTypes.Deleted: Console.WriteLine("{0} - deleted", e.Name); break; case WatcherChangeTypes.Created: Console.WriteLine("{0} - created", e.Name); break; case WatcherChangeTypes.Changed: Console.WriteLine("{0} - changed", e.Name); break; }