Лекция 1 «Программирование ввода/вывода в языке C icon

Лекция 1 «Программирование ввода/вывода в языке C



НазваниеЛекция 1 «Программирование ввода/вывода в языке C
Дата17.10.2016
Размер
ТипЛекция

Лекция 1

«Программирование ввода/вывода в языке C#»

План лекции:

  1. Организация C#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки. Классы потоков. Класс Stream. Классы байтовых потоков. Классы символьных потоков. Классы двоичных потоков.

  2. Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream.

  3. Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader.

  4. Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader.

  5. Навигация по файловой системе: классы для работы с файловой системой; получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов.


1.1. Организация C#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки

При создании полноценных приложений исключительно важна возможность сохранения информации между сеансами доступа пользователя.

Многие приложения хранят данные и обращаются с ними как с неделимыми элементами информации. Когда приложению необходима переменная или объект, оно называет нужное имя и получает то, что хочет. Однако при записи данных в файл, или передаче их по локальной сети или по Интернет, они должны быть организованы в потоки данных (streams). Внутри потока данные следуют друг за другом, как пузырьки воздуха в потоке воды.

Конечной точкой потока является какое-то запоминающее устройство. Оно служит источником данных, как озеро, из которого вытекает река. В типичном случае в качестве такого устройства выступает файл, но это может быть и локальная сеть, и веб-соединение. Поток данных, направленный в файл или из файла, ничем не отличается от потока данных, идущего по сети. Итак, поток (stream) - это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику. С помощью потока можно читать данные из различных источников (клавиатура, файл) и записывать в различные источники (принтер, экран, файл). Поток обеспечивает общую возможность взаимодействия с последовательностями байтов, независимо от того, на устройстве какого вида (в файле, сетевом соединении, принтере и т.п.) они хранятся или отображаются. Потоки обеспечивают надежную работу, как со стандартными типами данных, так и с определенными пользователем типами данных.

C#-система ввода-вывода построена на иерархии классов, определенной в пространстве имен System.IO. Несмотря на то, что потоки связываются с различными физическими устройствами, характер поведения всех потоков одинаков. Поэтому классы и методы ввода-вывода можно применить ко многим типам устройств.

На самом низком уровне C#-система ввода-вывода оперируют байтами. Это объясняется тем, что многие устройства при выполнении операций ввода-вывода ориентированы на байты. Однако для человека привычнее иметь дело с символами. Вспомним, что в C# тип char – это 16-разрядный тип, а тип byte – 8-разрядный. Преобразование типа char в byte для Unicode –символов, которым необходимы два байта, не сработает. Таким образом, байтовые потоки не вполне подходят для обработки текстового (ориентированного на символы) ввода-вывода. Поэтому разработаны символьные потоки, которые фактически представляют собой оболочки, выполняющие преобразование байтовых потоков в символьные и наоборот (byte -> char и char -> byte).

Любое приложение, использующее пространство имен System (включена инструкция using System;), может пользоваться тремя стандартными (встроенными) потоками, доступ к которым осуществляется через следующие свойства классов TextWriter и TextReader:

Console.In ­– относится к стандартному входному потоку (по умолчанию это клавиатура). Например, при вызове метода Console.ReadLine() информация автоматически передается в этот поток;

Console.Out ­– относится к стандартному выходному потоку (по умолчанию это консоль). Например, при вызове метода Console.WriteLine() информация автоматически передается в этот поток;

Console.Error – относится к ошибкам в стандартном потоке, источником которого по умолчанию является консоль.

Эти потоки могут быть перенаправлены на любое совместимое устройство ввода-вывода. Стандартные потоки являются символьными, т.е. они считывают и записывают символы.


^ 1.2. Классы потоков. Класс Stream. Классы байтовых потоков. Классы символьных потоков. Классы двоичных потоков

Классы потоков. В C# , в пространстве имен System.IO, определены как байтовые, так и символьные классы потоков. Чтобы можно было использовать эти классы, в начало программы следует включить инструкцию using System.IO;. Для ввода и вывода на консоль эту инструкцию задавать не нужно, так как класс Console определен в пространстве имен System (инструкция using System;).


Классы библиотеки .NET для работы с потоками



MarshalByRefObject

BinaryReader

BinaryWritter

Directory

FileSystemInfo

Stream

DirectoryInfo

BufferedStreamm

FileStream

MemoryStream

StreamWriter

StringWriter




FileInfo


TextReader


StreamReader




StringReader


TextWriter







Классы библиотеки позволяют работать в различных режимах с файлами, каталогами и областями оперативной памяти. Выполнять обмен с внешними устройствами можно на уровне:

  • двоичного представления данных (BinaryReader, BinaryWritter);

  • байтов (FileStream);

  • текста, т.е. символов (StreamReader, StreamWriter).

Двоичные и байтовые потоки хранят данные в том же виде, в котором они представлены в оперативной памяти, т.е. при обмене с файлом происходит побитовое копирование информации.


^ 1.3. Класс Stream. Центральную часть потоковой C#-системы занимает класс System.IO.Stream. Класс Stream представляет байтовый поток и является базовым абстрактным классом для всех остальных потоковых классов. В классе Stream определяется ряд операций со стандартными потоками, представленных соответствующими методами. Рассмотрим ряд наиболее часто используемых методов:

  • void Close() — завершает текущий поток и освобождает все связанные с текущим потоком ресурсы (например, дескриптор файла);

  • void Flush( ) — выводит содержимое буфера на физическое устройство, а затем очищает буфер;

  • int ReadByte( ) — возвращает целочисленное представление следующего байта, доступного для ввода из потока. При обнаружении конца файла возвращает значение -1;

  • int Read (byte [ ] buffer, int offset, int count) — делает попытку прочитать count байтов в массив buffer, начиная с элемента buffer [offset]. Возвращает количество успешно прочитанных байтов;

  • long Seek (long offset, SeekOrigin origin) — устанавливает текущее положение в потоке по указанному смещению offset относительно заданного начала отсчета origin. Возвращает новое положение в потоке;

  • void WriteByte (byte value) —записывает один байт в поток вывода;

  • void Write (byte [ ] buffer, int offset, int count) — выводит подмножество count байтов из массива buffer, начиная с элемента buffer[offset]. Возвращает количество выведенных байтов.

В общем случае при возникновении ошибки ввода-вывода методы генерируют исключение IOException.

Следует заметить, что в классе Stream определены методы для ввода (или чтения) и вывода (или записи) данных. Но не все потоки поддерживают обе эти операции, поскольку поток можно открывать только для чтения или только для записи. Кроме того, не все потоки поддерживают запрос текущего положения в потоке с помощью метода Seek(). Для того чтобы определить возможности потока, придется воспользоваться одним, а то и несколькими свойствами класса Stream:

  • bool CanWrite — принимает значение true, если в поток можно записывать данные. Доступно только для чтения;

  • long Length — содержит длину потока. Доступно только для чтения;

  • long Position — представляет текущее положение в потоке. Доступно как для чтения, так и для записи;

  • int ReadTimeout — представляет продолжительность времени ожидания в операциях ввода. Доступно как для чтения, так и для записи;

  • int WriteTimeout — представляет продолжительность времени ожидания в операциях вывода. Доступно как для чтения, так и для записи;

  • и др.


^ 1.4. Классы байтовых потоков. Производными от класса Stream являются несколько конкретных классов байтовых потоков. Эти классы определены в пространстве System.IO и перечислены ниже:



^ Класс потока

Описание

BufferedStream

Временное хранение потока байтов (буферизация). Буферизация, как правило, повышает

производительность.

FileStream

Произвольный (прямой) доступ к файлу, представленному как поток байтов.

MemoryStream

Произвольный (прямой) доступ к потоку байтов в оперативной памяти


^ 1.5. Классы символьных потоков:


Классы потока

Описание

StreamReader , StreamWriter

Чтение из файла и запись в файл тестовой информации (последовательный доступ).

StringReader,

StringWriter


Работа с текстовой информацией в оперативной памяти. Соответствующим хранилищем является строковый буфер, а не физический файл.
Символьные потоки StreamReader и StreamWriter работают с Unicode-символами, поэтому ими удобнее пользоваться для работы с текстовыми файлами, предназначенными для восприятия человеком. Эти потоки являются наследниками базовых абстрактных классов TextWriter и TextReader.


^ 1.6. Классы двоичных потоков:


Классы потока

Описание

BinaryReader,

BinaryWritter


Чтение и запись в файл простых встроенных типов (числовых, логических, символьных и т.п.) во внутренней (двоичной) форме представления
Двоичные файлы хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть во внутреннем представлении. Двоичные файлы не применяются для просмотра человеком, они используются только для программной обработки. Двоичный файл открывается на основе базового потока, в качестве которого чаще всего используется поток FileStream. Входной двоичный поток BinaryReader содержит перегруженные методы чтения для всех простых встроенных типов данных. Выходной поток BinaryWriter поддерживает произвольный доступ, т.е. имеется возможность выполнять запись в произвольную позицию двоичного файла.

Двоичные файлы являются файлами с произвольным доступом, при этом нумерация элементов в двоичном файле ведется с нуля. Произвольный доступ обеспечивает метод Seek. Рассмотрим его синтаксис:

^ Seek(long newPos, SeekOrigin pos), где параметр newPos определяет новую позицию внутреннего указателя файла в байтах относительно исходной позиции указателя, которая определяется параметром pos. В свою очередь параметр pos должен быть задан одним из значений перечисления SeekOrigin:

Значение

Описание

SeekOrigin.Begin

Поиск от начала файла

SeekOrigin.Current

Поиск от текущей позиции указателя

SeekOrigin.End

Поиск от конца файла

После вызова метода Seek следующие операции чтения или записи будут выполняться с новой позиции внутреннего указателя файла.


^ 2.1. Класс FileStream и файловый ввод-вывод на побайтовой основе

Как известно, информация, обрабатываемая компьютером, хранится в файлах. Под файлом подразумевается именованная информация на внешнем носителе, например, на жестком диске. Логически файл можно рассматривать как конечное количество последовательных байтов, поэтому такие устройства как дисплей, клавиатура, принтер можно рассматривать как частные случаи файлов. Передача данных с внешнего устройства в оперативную память называется чтением или вводом, обратный процесс – записью или выводом.

Типы файлов для хранения той или иной информации могут быть различны. Как правило, разработчик сам сочиняет необходимую структуру файла, например, doc. Также существуют стандарты, описывающие, каким образом информация должна храниться в файле jpeg, html и т.д. Несмотря на большое разнообразие форматов, их можно разделить на два класса: двоичные (бинарные) и текстовые. Обычно текстовые файлы применяются для хранения текстовой информации: txt, html, ini. Двоичные файлы применяются для хранения нетекстовой информации: изображений (bmp, jpg), исполняемых файлов (dll, ехе) и др.

^ Доступ к файлам может быть последовательным, когда очередной элемент можно прочитать (записать) только после аналогичной операции с предыдущим элементом, и произвольным, или прямым, при котором выполняется чтение (запись) произвольного элемента по заданному адресу.

Рассмотрим простейшие способы работы с файловыми потоками. Использование классов файловых потоков в программе предполагает следующие операции:

1. Создание потока и связывание его с физическим файлом.

2. Обмен (ввод-вывод).

3. Закрытие файла.


^ 2.2. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream

Каждый класс файловых потоков содержит несколько вариантов конструкторов, с помощью которых можно создавать объекты этих классов различными способами и в различных режимах. Например, файлы можно открывать только для чтения, только для записи или для чтения и записи.

На уровне операционной системы файлы имеют байтовую организацию. Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream, который является наследником абстрактного класса Stream, определяющего набор стандартных операций с потоками.

Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream. При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи: FileStream(string filename, FileMode mode), где:

1. параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта.

2. параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode:

а) FileMode.Append — предназначен для добавления данных в конец
файла;

б) FileMode.Create — предназначен для создания нового файла, при этом если существует файл с таким же именем, то он будет предварительно удален;

в) FileMode.CreateNew — предназначен для создания нового файла, при этом файл с таким же именем не должен существовать;

г) FileMode.Open — предназначен для открытия существующего файла;

д) FileMode.OpenOrCreate — если файл существует, то открывает его, в противном случае создает новый;

е) FileMode.Truncate — открывает существующий файл, но усекает его длину до нуля;

Если попытка открыть файл оказалась неуспешной, то генерируется одно из исключений:

FileNotFoundException — файл невозможно открыть по причине его отсутствия;

  • IOException — файл невозможно открыть из-за ошибки ввода-вывода;

  • ArgumentNullException — имя файла представляет собой null-значение;

  • ArgumentException — некорректен параметр mode;

  • SecurityException — пользователь не обладает правами доступа;

  • DirectoryNotFoundException — некорректно задан каталог.

Другая версия конструктора позволяет ограничить доступ только чтением или только записью: FileStream(string filename, FileMode mode, FileAccess how),

где: 1. параметры filename и mode имеют то же назначение, что и в
предыдущей версии конструктора;

2. параметр how, определяет способ доступа к файлу и может принимать одно из значений, определенных перечислением FileAccess:

а) FileAccess.Read — только чтение;

б) FileAccess.Write — только запись;

в) FileAccess.ReadWrite — и чтение, и запись.

После установления связи байтового потока с физическим файлом внутренний указатель потока устанавливается на начальный байт файла.

^ Для чтения очередного байта из потока, связанного с физическим файлом, используется метод ReadByte(). После прочтения очередного байта внутренний указатель перемещается на следующий байт файла. Если достигнут конец файла, то метод ReadByte() возвращает значение -1.

^ Для побайтовой записи данных в поток используется метод WriteByte().

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

При выводе в файл выводимые данные зачастую записываются на конкретном физическом устройстве не сразу. Вместо этого они буферизуются на уровне операционной системы до тех пор, пока не накопится достаточный объем данных, чтобы записать их сразу одним блоком. Благодаря этому повышается эффективность системы. Так, на диске файлы организованы по секторам величиной от 128 байтов и более. Поэтому выводимые данные обычно буферизуются до тех пор, пока не появится возможность записать на диск сразу весь сектор.

Но если данные требуется записать на физическое устройство без предварительного накопления в буфере, то для этой цели можно вызвать метод Flush: void Flush().При неудачном исходе данной операции генерируется исключение IOException. Если же поток закрыт, то генерируется исключение ObjectDisposedException.


  1. ^ Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader

Классы StreamWriter и StreamReader удобны во всех случаях, когда нужно читать или записывать символьные данные (например, текст). Класс StreamReader осуществляет чтение символьных данных из потока и их преобразование. Данный класс унаследован от абстрактного класса по имени TextReader. Класс StreamWriter позволяет осуществлять запись в файл символов и строк и самостоятельно выполняет все необходимые преобразования. Данный класс наследуется от абстрактного базового класса по имени TextWriter.

^ Наиболее важные методы базового класса TextWriter:


Метод

Описание




Close ()

Метод закрывает файл и освобождает все связанные с ним ресурсы. В процессе автоматически очищается буфер (функционально эквивалентен методу Dispose())




Flush ()

Метод очищает все буферы для текущего файла и записывает все буферизованные данные на лежащее в основе устройство, однако, не закрывает файл.




NewLine

Это свойство задает константу перевода строки. По умолчанию используется последовательность «возврат каретки»– «перевод строки»(\r\n).




Write ()

Метод записывает текст в символьный поток без добавления константы новой строки.




WriteLine ()

Метод записывает строку в поток и переходит на другую строку.






^ Наиболее важные методы базового класса TextReader:


Метод

Описание




Peek()

Метод возвращает следующий символ, не изменяя позицию указателя в файле.




Read()

Метод считывает данные из входного потока.




ReadBlock()

Считывает из входного потока указанное пользователем количество символов и записывает их в буфер, начиная с заданной позиции.




ReadLine()

Считывает строку из текущего потока и возвращает ее как значение типа string. Пустая строка (null) означает конец файла (EOF).




ReadToEnd()

Считывает все символы до конца потока, начиная с текущей позиции, и возвращает считанные данные как одну строку типа string.






Чтобы создать символьный поток, нужно поместить объект класса Stream (например, FileStream) "внутрь" объекта класса StreamWriter или объекта класса StreamReader. В этом случае байтовый поток будет автоматически преобразовываться в символьный.

Класс StreamWriter предназначен для организации выходного символьного потока. В нем определено несколько конструкторов. Один из них записывается следующим образом: StreamWriter(Stream stream), где параметр stream определяет имя уже открытого байтового потока. Например, создать экземпляр класса StreamWriter можно следующим образом:

StreamWriter fileOut=new StreamWriter(new FileStream("text.txt",FileMode. Create, FileAccess.Write));

Этот конструктор генерирует исключение типа ArgumentException, если поток stream не открыт для вывода, и исключение типа ArgumentNullException, если он (поток) имеет null-значение.Другой вид конструктора позволяет открыть поток сразу через обращение к файлу: StreamWriter(string name), где параметр name определяет имя открываемого файла. Например, обратиться к данному конструктору можно следующим образом: StreamWriter fileOut = new StreamWriter("c:\temp\t.txt");

Имеется еще один вариант конструктора StreamWriter:

StreamWriter(string name, bool appendFlag), где параметр name определяет имя открываемого файла; параметр appendFlag может принимать значение true, если нужно добавлять данные в конец файла, или false — если файл необходимо перезаписать. Например: StreamWriter fileOut = new StreamWriter("t.txt", true);

Теперь для записи данных в поток fileOut можно обратиться к методу WriteLine. Это можно сделать следующим образом: fileOut.WriteLine("test"); В данном случае в конец файла t.txt будет дописано слово test.

Класс StreamReader предназначен для организации входного символьного потока. Один из его конструкторов выглядит следующим образом:

StreamReader(Stream stream), где параметр stream определяет имя уже открытого байтового потока. Этот конструктор генерирует исключение типа ArgumentException, если поток stream не открыт для ввода. Например, создать экземпляр класса StreamReader можно следующим образом:

StreamReader fileln = new StreamReader(new FileStream("text.txt", true,

FileMode.Open, FileAccess.Read));

Как и в случае с классом StreamWriter у класса StreamReader есть и другой вид конструктора, который позволяет открыть файл напрямую: StreamReader (string name), где параметр name определяет имя открываемого файла. Обратиться к данному конструктору можно следующим образом: StreamReader fileln=new StreamReader ("c:\temp\t.txt");

В С# символы реализуются кодировкой Unicode. Для того чтобы можно было обрабатывать текстовые файлы, содержащие русский символы, созданные, например, в Блокноте, рекомендуется вызывать следующий вид конструктора StreamReader:

StreamReader fileln=new StreamReader ("c:\temp\t.txt", true, Encoding. GetEncoding( 1251));

Параметр Encoding.GetEncoding(1251) говорит о том, что будет выполняться преобразование из кода Windows-1251 (одна из модификаций кода ASCII, содержащая русские символы) в Unicode. Encoding.GetEncoding(1251) реализован в пространстве имен System.Text.

Теперь для чтения данных из потока fileln можно воспользоваться методом ReadLine(). При этом если будет достигнут конец файла, то метод ReadLine() вернет значение null.


^ 4. Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader

Классы Binary Writer и Binary Reader являются прямыми наследниками System.Object. Эти типы позволяют записывать и читать дискретные типы данных в потоки в компактном двоичном формате. В классе BinaryWriter определен многократно перегруженный метод Write() для помещения типов данных в лежащий в основе поток. В дополнение к Write(), класс BinaryWriter предоставляет дополнительные члены, позволяющие получать или устанавливать объекты унаследованных от Stream типов, а также поддерживает произвольный доступ к данным.


^ Наиболее важные методы выходного потока BinaryWriter:

Член класса

Описание

BaseStream()

Определяет базовый поток, с которым работает объект BinaryWriter

Close()

Закрывает поток

Flush()

Очищает буфер

Seek()

Устанавливает позицию в текущем потоке

Write()

Записывает значение в текущий поток


^ Наиболее важные методы входного потока BinaryReader:

Член класса

Описание

BaseStream()

Определяет базовый поток, с которым работает объект BinaryReader

Close()

Закрывает поток

PeekChar()

Возвращает следующий символ потока без перемещения внутреннего указателя в потоке

Read()

Считывает очередной поток байтов или символов и сохраняет в массиве, передаваемом как входной параметр

ReadBoolean(), ReadByte() и др.

Считывает из потока данные определенного типа

Двоичный поток открывается на основе базового потока (например, FileStream), при этом двоичный поток будет преобразовывать байтовый поток в значения int-, double-, short- и т.д. Попытка просмотреть двоичный файл через текстовый редактор неинформативна. Двоичный файл просматривается программным путем.

Следует помнить, что объект FileStream, возвращенный методом Filelnfo.OpenWrite(), передается конструктору класса BinaryWriter. Используя эту технику, очень просто организовать по уровням поток перед записью данных. Нужно иметь в виду, что конструктор BinaryWriter принимает любой тип, унаследованный от Stream (т.е. FileStream, MemoryStream или BufferedStream). Таким образом, если необходимо записать двоичные данные в память, просто используйте объект MemoryStream.


5. Навигация по файловой системе: классы для работы с файловой системой; получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов

Одной из самых распространенных задач в рутинной работе программиста является работа с файловой системой. Она включает как навигацию и сбор информации о дисках, папках и файлах, так и отслеживание изменений, происходящих в файловой системе. Задачей многих типов, принадлежащих System.IO, является программная поддержка физических операций с каталогами и файлами.

^ 5.1. Классы для работы с файловой системой. В пространстве имен System.IO есть четыре класса, предназначенные для работы с физическими файлами и структурой каталогов на диске: Directory, File, DirectoryInfo, FileInfo. С их помощью можно выполнять создание, удаление, перемещение файлов и каталогов, а также получение их свойств.

Классы Directory и File реализуют свои функции через статические методы. Классы DirectoryInfo и FileInfo обладают схожими возможностями, но они реализуются путем создания объектов соответствующих классов. Эти два класса наследуются от абстрактного класса FileSystemInfo, в котором имеются следующие базовые свойства:

  • Attributes – получить или установить атрибуты для текущего файла или папки;

  • CreationTime – получить или установить время создания текущего файла или папки;

  • Exists – определить, существует ли файл или папка;

  • Exstension – получить расширение файла в виде строки;

  • FullName – возвратить полный путь к файлу или папке;

  • LastWriteTime – получить или установить время последней записи в файл или папку;

  • LastAccessTime – получить или установить время последнего обращения к файлу или папке;

  • Name – возвратить «простое» имя файла или папки,

а также методы:

  • Delete – удалить файл или папку;

  • Refresh – обновить экземпляр класса последними данными о файловой системе.

Класс DirectoryInfo содержит следующие методы и свойство, позволяющие создавать, перемещать, удалять каталоги и подкаталоги:

Член класса

Описание

Create()

CreateSubDirectory()

Создает каталог или подкаталог по указанному пути в файловой системе.

Delete(true)

Удаляет каталог и все его содержимое.

GetDirectories()

Возвращает массив строк, представляющих все подкаталоги текущего каталога.

GetFiles()

Получает файлы текущего каталога в виде массива объектов класса FileInfo.

MoveTo()

Перемещает каталог и его содержимое в место, соответствующее заданному новому пути.

Parent

Возвращает родительский каталог.

Класс FileInfo предоставляет следующую базовую функциональность для доступа к отдельным файлам и управления ими:

Свойства класса

Описание

Directory

Возвращает объект DirectoryInfo, представляющий папку, в которой расположен файл.



DirectoryName

Возвращает полный путь к каталогу родителя.

IsReadOnly

Возвращает или устанавливает флаг, определяющий возможность изменения или удаления файла.

Length

Возвращает размер файла.




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

Описание

AppendText()

Создает новый объект StreamWriter, позволяющий добавлять текст в файл.

CopyTo()

Создает копию файла в другом каталоге.

Create()

Создает файл с параметрами текущего файла.

CreateText()

Создает новый объект StreamWriter и новый файл для записи текста.

Decrypt()


Encrypt()

Расшифровывает файл, зашифрованный текущим пользователем.

Зашифровывает файл, делая его содержимое доступным только текущему пользователю.


MoveTo()

Перемещает файл в другой каталог.

Open()

Открывает файл с заданными возможностями чтения/записи и совместного доступа.

OpenRead()

Открывает файл только для чтения.

OpenText()

Открывает файл и возвращает объект StreamReader для чтения текста из файла.

OpenWrite()

Открывает файл только для записи.

Replace()

Заменяет файл файлом, созданным по параметрам текущего объекта FileInfo.



Перечень (enum) FileAttributes. Свойство Attributes, предоставленное объектом FileSystemInfo, обеспечивает получение различной информации о текущем каталоге или файле, и вся она содержится в перечне FileAttributes:

public enum FileAttributes

{

Archive, /*Использеутся приложениями при выполнении резервного копирования, а внекоторых случаях – при удалении старых файлов.*/

Compressed, //Файл является сжатым.

^ Directory, /* Объект файловой системы является каталогом.*/

Encrypted, //Файл является зашифрованным.

Hidden, //Файл является скрытым.

Normal, /*Файл находится в обычном состоянии, и для него установлены любые другие атрибуты.*/

^ Offline, /*Файл, расположенный на сервере, кэширован в хранилище на клиентском компьютере. Возможно, что данные этого файла уже устарели.*/

ReadOnly, //Файл доступен только для чтения.

System //Файл является системным.

}


^ 5.2. Получение сведений о файле; копирование файлов; перечисление файлов в папке

Для указания полного пути к файлу удобно использовать Дословные литералы или Дословное применение. Эти литералы предваряются символом @, который отключает обработку управляющих последовательностей (например, \n) и позволяет получать строки в таком виде, в котором они записаны. В дословных литералах не требуется дублировать обратную косую черту.

Вот два варианта записи одного и того же пути:

“C:\\app\\bin\\a.exe”

@“C:\app\bin\a.exe”

Чтобы получить доступ к текущему каталогу приложения можно использовать обозначение: “.”


Примеры:

1) Привязка к текущему каталогу приложения:

DirectoyInfo dir1=new DirectoyInfo(“.”);

2) Привязка к каталогу C:\Windows с помощью дословного литерала:

DirectoyInfo dir2=new DirectoyInfo(@”C:\Windows” );

3) Привязка к несуществующему каталогу с последущим его созданием:

DirectoyInfo dir3=new DirectoyInfo(@”F:\СТП\ЛР” );

dir3.Create();


^ 5.3. Изменение расширения файлов

Для управления путями файловой системы имеется статический класс Path. Он позволяет запрашивать и разбирать пути файловой системы.

Некоторые статические методы класса Path:

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

Описание

ChangeExtension()

Принимает в качестве параметра путь и возвращает путь к файлу с другим расширением. Внимание! Изменяется только строка пути, расширение настоящего файла не изменяется.

GetExtension()

Возвращает расширение файла, соответствующего заданному пути.

GetFileName()

Возвращает имя файла, соответствующего заданному пути.

GetFullPath()

Возвращает полный путь, соответствующий заданному пути.

GetPathRoot()



Возвращает корневой каталог из заданного пути.




Похожие:

Лекция 1 «Программирование ввода/вывода в языке C iconЭлектроэнергетика и информационные технологии
Алфавит, типы данных и переменных на языке turbo paskal. Организация ввода-вывода
Лекция 1 «Программирование ввода/вывода в языке C iconПамятью и системой ввода-вывода
Существует также возможность ввода-вывода данных из памяти на внешние устройства и обратно, минуя цп. Этот механизм называется прямым...
Лекция 1 «Программирование ввода/вывода в языке C iconУрок тема урока: структура программы на языке паскаль. Процедуры ввода вывода. Интегрированная среда турбо паскаль
Урок тема урока: структура программы на языке паскаль. Процедуры ввода – вывода. Интегрированная среда турбо паскаль
Лекция 1 «Программирование ввода/вывода в языке C iconЛекция 5 " Аппаратные средства и периферийные устройства. Стандартные устройства ввода-вывода ". Процесс взаимодействия пользователя с компьютером (эвм)
Аппаратные средства и периферийные устройства. Стандартные устройства ввода-вывода ”
Лекция 1 «Программирование ввода/вывода в языке C iconИндивидуальное домашнее задание №1 мт2, 2 семестр Представление графа Указания по выполнению идз №1
Реализовать процедуры: ввода и вывода из файла, процедуру преобразования из одной структуры данных в другую
Лекция 1 «Программирование ввода/вывода в языке C iconЛекция периферийные устройства ЭВМ
В состав современных ЭВМ входят многочисленные и разнообразные внешние (периферийные) устройства. К ним относят устройства ввода-вывода...
Лекция 1 «Программирование ввода/вывода в языке C iconПрограмма элективного курса «Программирование на языке Turbo Pascal» 9 класс
Предлагаемый элективный профильный курс предназначен для тех, кто хочет освоить программирование в среде Turbo Pascal. Курс предполагает...
Лекция 1 «Программирование ввода/вывода в языке C iconЛекция 2 «Многопоточное программирование в языке C
Пространство имен System. Threading. Класс Thread. Создание потока. Использование нескольких потоков. Планирование потоков, приоритеты...
Лекция 1 «Программирование ввода/вывода в языке C iconСоздание консольных приложений
Мы не будем описывать здесь внутренние автоматические процессы, использующие сигналы непрерывно функционирующих программ, а сосредоточим...
Лекция 1 «Программирование ввода/вывода в языке C iconЛекция №1 Тема: Математическое программирование
В математическом программировании выделяют линейное программирование – когда функции и линейны, квадратичное программирование, когда...
Разместите ссылку на наш сайт:
Уроки, сочинения


База данных защищена авторским правом ©izlov.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
связаться с нами