Высокоуровневые методы информатики и...

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

Upload: ashanti

Post on 23-Feb-2016

108 views

Category:

Documents


0 download

DESCRIPTION

Высокоуровневые методы информатики и программирования Лекция 1 8 Работа с файлами. План работы. Типы файлов Класс FileStream Классы StreamReader и StreamWriter Классы BynaryReader и BynaryWriter Класс FileSystemWatcher Сериализация. Файлы и потоки. - PowerPoint PPT Presentation

TRANSCRIPT

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

Высокоуровневые методы информатики и

программирования

Лекция 18

Работа с файлами

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

План работы

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

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

Файлы и потоки• Файл – поименованные данные, хранящиеся

на диске (кроме имени еще задается путь).• Поток – это сущность, допускающая операции

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

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

Типы файлов• текстовые – содержат коды символов

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

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

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

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

• Пространство имен System.IO• FileStream – базовый класс (файловый поток)

позволяет побайтно читать/записывать содержание файла;

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

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

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

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

• Полное имя - System.IO.FileStream• Позволяет открывать и выполнять работу с

содержанием файла• Позволяет только побайтную работу с файлом

(считать байт, записать байт)• В C# нет простых средств для преобразования

массива байтов в другие типы данных.• Имеет 5 конструкторовFileStream (flName, FileMode fm)FileStream (flName, FileMode fm, FileAccess fa)

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

Работа с содержанием файла с помощью класса 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...

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

Параметры открытия файла• Перечисление режимов открытия файла:public enum FileMode{ CreateNew, Create, Open, OpenOrCreate, Truncate, Append }

• Перечисление виды выполняемых операций ввода/вывода:public enum FileAccess{ Read, Write, ReadWrite }

• Перечисление режимов совместной работы с файлом:public enum FileShare{ None, Read, Write, ReadWrite }

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

Перечисление FileModeCreateNew 1 Ошибка если файл существует

Create 2 Если файл существует, то его содержимое удаляется

Open 3 Ошибка если файл не существует

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

Truncate 5 Ошибка если файл не существует; содержимое удаляется

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

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

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

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

Write 2 Ошибка, если файл имеет атрибут «только для чтения»

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

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

Перечисление FileShare• None – не разрешается совместно использовать

текущий файл. Любому запросу к открытому файлу (в текущем процессе или другом процессе) будет отказано до тех пор, пока файл не закроется.

• Read – разрешается последующее открытие файла на чтение.

• Write - разрешается последующее открытие файла на запись.

• ReadWrite - разрешается последующее открытие файла на чтение и запись.

• Delete - разрешается последующее удаление файла.

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

Методы класса 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() – закрыть файл.

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

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

Поток файлаFileStream

Используется для создания

Используется для создания

Для чтения данныхStreamWriter

Для записи данныхStreamReader

Для чтения данныхBinaryWriter

Для записи данныхBinaryReader

TextReaderTextWriter

ПотокStream

Абстрактный класс для последовательности байтов

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

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

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

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

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

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

создаем объект класса FileStream - fs.• с помощью fs создаем объект класса

– StreamReader / StreamWriter (объекты этих классов можно сосздать и с помощью имени файла);

– BinaryReader / BinaryWriter;• после окончания работы с fs нужно

вызвать метод Close().

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

Методы классов 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, для добавления в

конец содержания текущего файла.

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

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

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

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

// Получить ссылку FileStream для чтенияFileInfo f3 = new FileInfo(@"C:\Test3.dat");FileStream readOnlyStream = f3.OpenRead();// . . . использование объекта FileStreamreadOnlyStream.Close();

// получение объекта FileStream для записиFileInfo f4 = new FileInfo(@"C:\Test4.dat");FileStream writeOnlyStream = f4.OpenWrite();//. . . использование объекта FileStreamwriteOnlyStream.Close();

// Получаем ссылку на объект класса StreamReaderFileInfo f5 = new FileInfo(@"C:\boot.ini");StreamReader sreader = f5.OpenText();// . . . использование объекта StreamReadersreader.Close();

// Получаем ссылку на новый файлFileInfo f6 = new FileInfo(@"C:\Test5.txt");StreamWriter swriter = f6.CreateText();// . . . использование объекта StreamWriterswriter.Close();

// Получаем ссылку для добавления текста к файлуFileInfo f7 = new FileInfo(@"C:\FinTst.txt");StreamWriter swAppend = f7.AppendText();// . . . использование объекта StreamWriterswAppend.Close();

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

Конструкторы классов• Класс 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)

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

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

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

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

Пример чтения из текстового файла

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

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

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

FileStream fs = new FileStream ("c:\\TestFile.txt",FileMode.Create);

StreamWriter sw = new StreamWriter(fs);

// записываем целое числоsw.Write(15);// закрываем файлsw.Close();

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

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

StreamReader sr;sr = new StreamReader(@"C:\aaa.txt");

string sLine;

dosLine = sr.ReadLine();

while (sLine != null);

sr.Close();

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

Двоичные (бинарные) файлы• Хранят обычно числовые данные во внутреннем

формате (так, как они хранятся в оперативной памяти).

• Конструкторы используют объекта FileStream– BynaryWriter(Stream st)– BynaryReader(Stream st)

• Например:FileStream fs = new FileStream("c:\\TestFile.myfile",

FileMode.Create);BinaryWriter bw = new BinaryWriter(fs);

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

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

• Методы класса 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()

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

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

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

Методы 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;• . . .

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

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

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

Класс для наблюдением за происходящими

изменениями в файловой системе -FileSystemWatcher

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

Класс 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;

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

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

Имя Изменения описанийAttributes Атрибуты файла или папкиCreationTime Время создания файла или папкиDirectoryName Имя папкиFileName Имя файла

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

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

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

Примеры использования 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;

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

Класс FileSystemEventArgs

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

– ChangeType – тип произошедшего события (из перечисления WatcherChangeTypes)

– FullPath – полный путь к измененному файлу или папке

– Name – имя измененного файла или папки

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

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

Имя ОписаниеAll Создание, удаление, изменение или переименование

файла или папкиChanged Изменение файла или папки. Тип изменения

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

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

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

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

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

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

Пример обработчика события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; }}