340 likes | 568 Views
Высокоуровневые методы информатики и программирования Лекция 1 8 Работа с файлами. План работы. Типы файлов Класс FileStream Классы StreamReader и StreamWriter Классы BynaryReader и BynaryWriter Класс FileSystemWatcher Сериализация. Файлы и потоки.
E N D
Высокоуровневые методы информатики и программированияЛекция 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, FileAccessfa)
Работа с содержанием файла с помощью класса FileStream • Создание файла // Создаем новый файл на диске C FileInfof = newFileInfo(@"C:\Test.dat"); // создаем файл и получаем доступ к потоку FileStreamfs = f.Create(); // используем объект FileStreamobject . . . // закрываем поток fs.Close(); • Открытие файла // создаем новый файл с помощью FileInfo.Open() FileInfo f2 = newFileInfo(@"C:\Test2.dat"); FileStream fs2 = f2.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); // UsetheFileStreamobject...
Параметры открытия файла • Перечисление режимов открытия файла: publicenumFileMode { CreateNew, Create, Open, OpenOrCreate, Truncate, Append } • Перечисление виды выполняемых операций ввода/вывода: publicenumFileAccess { Read, Write, ReadWrite } • Перечисление режимов совместной работы с файлом: publicenumFileShare { None, Read, Write, ReadWrite }
Перечисление FileShare • None – не разрешается совместно использовать текущий файл. Любому запросу к открытому файлу (в текущем процессе или другом процессе) будет отказано до тех пор, пока файл не закроется. • Read– разрешается последующее открытие файла на чтение. • Write- разрешается последующее открытие файла на запись. • ReadWrite- разрешается последующее открытие файла на чтение и запись. • Delete- разрешается последующее удаление файла.
Методы класса FileStream • intReadByte()- читать следующий байт; • int Read(byte[] buf, int offset, intiCount) - читать участок файла; • void WriteByte(byte val) – записать следующий байт; • void Write(byte[] buf, int offset, intiCount) – записать массив байтов; • 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(). FileStreamfs = File.Create(@"C:\Test.dat"); • Получаем объект FileStream с помощью File.Open(). FileStream fs2 = File.Open(@"C:\Test2.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.None); • Получаем объект FileStream только для чтения FileStreamreadOnlyStream = File.OpenRead(@"Test3.dat"); • Получаем объект FileStream только для записи FileStreamwriteOnlyStream = File.OpenWrite(@"Test4.dat"); • Пример создания объектов класса StreamReader / StreamWriter: • ПолучаемобъектStreamReader StreamReadersreader = File.OpenText(@"C:\boot.ini"); • Получаем объект StreamReader для нового файла StreamWriterswriter = File.CreateText(@"C:\Test3.txt"); • Получаем объект StreamReader для добавления текста StreamWriterswAppend = File.AppendText(@"C:\FinTst.txt");
Получение объектов FileStreamс помощью объектов FileInfo // Получить ссылку FileStream для чтения FileInfo f3 = new FileInfo(@"C:\Test3.dat"); FileStreamreadOnlyStream = f3.OpenRead(); // . . . использование объекта FileStream readOnlyStream.Close(); // получение объекта FileStream для записи FileInfo f4 = new FileInfo(@"C:\Test4.dat"); FileStreamwriteOnlyStream = f4.OpenWrite(); //. . . использованиеобъектаFileStream writeOnlyStream.Close(); // Получаем ссылку на объект класса StreamReader FileInfo f5 = new FileInfo(@"C:\boot.ini"); StreamReadersreader = f5.OpenText(); // . . . использованиеобъектаStreamReader sreader.Close(); // Получаем ссылку на новый файл FileInfo f6 = new FileInfo(@"C:\Test5.txt"); StreamWriterswriter = f6.CreateText(); // . . . использование объекта StreamWriter swriter.Close(); // Получаем ссылку для добавления текста к файлу FileInfo f7 = new FileInfo(@"C:\FinTst.txt"); StreamWriterswAppend = f7.AppendText(); // . . . использованиеобъектаStreamWriter swAppend.Close();
Конструкторы классов • Класс StreamWriter • StreamWriter(Stream FileStream) • StreamWriter(Stream FileStream, Encoding enc) • StreamWriter(string FileName) • StreamWriter(string FileName, boolbAppend) • StreamWriter(string FileName, boolbAppend, 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(inti = 0; i < 5; i++) writer.Write(i + " "); // вставляем символ новой строки writer.Write(writer.NewLine);
Пример чтения из текстового файла StreamReadersr = 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 = newFileStream ("c:\\TestFile.txt",FileMode.Create); StreamWriter sw = new StreamWriter(fs); // записываем целое число sw.Write(15); // закрываем файл sw.Close();
Пример использованияобъекта StreamReader StreamReadersr; sr = new StreamReader(@"C:\aaa.txt"); string sLine; do sLine = sr.ReadLine(); while (sLine != null); sr.Close();
Двоичные (бинарные) файлы • Хранят обычно числовые данные во внутреннем формате (так, как они хранятся в оперативной памяти). • Конструкторы используют объекта FileStream • BynaryWriter(Stream st) • BynaryReader(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"); BinaryWriterbw = new BinaryWriter(f.OpenWrite()); // выводим на экран тип объекта BaseStream. Console.WriteLine("Base stream is: {0}",bw.BaseStream); // создаем некоторые данные для сохранения в файле double aDouble = 1234.67; intanInt = 34567; string aString = "A, B, C"; // записывем данные в файл bw.Write(aDouble); bw.Write(anInt); bw.Write(aString);
Методы Read()класса BinaryReader • boolReadBoolean()– чтение логического значения; • 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"); ... // Чтениеданныхизбинарногофайла BinaryReaderbr = 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+= newFileSystemEventHandler(OnChanged); • Запуск наблюдения за событиями watcher.EnableRaisingEvents = true;
Перечисление NotifyFilters Типы событий за которыми требуется наблюдать:
Примеры использования FileSystemWatcher • Создание объекта: FileSystemWatcherwatcher = newFileSystemWatcher(); • Задаем путь к каталогу за которым наблюдаем watcher.Path = @”C:\Test”; • Задаем шаблон файлов, за которыми выполняется наблюдение watcher.Filter = "*.txt"; • Задаем список событий, за которыми выполняется наблюдение watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; • Задаем обработчики событий: watcher.Changed+= newFileSystemEventHandler(OnChanged); watcher.Created+= newFileSystemEventHandler(OnChanged); watcher.Deleted+= newFileSystemEventHandler(OnChanged); watcher.Renamed += newRenamedEventHandler(OnRenamed); • Запуск наблюдения за событиями watcher.EnableRaisingEvents = true;
Класс FileSystemEventArgs • Данные о событиях в файлах папки • Свойства • ChangeType – тип произошедшего события (из перечисления WatcherChangeTypes) • FullPath – полный путь к измененному файлу или папке • Name – имя измененного файла или папки
ПеречислениеWatcherChangeTypes Типы событий, которые произошли в наблюдаемой папке:
Пример обработчика события 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; } }