- •17. Работа с файлами.
- •17.1 Классы для работы с папками и файлами
- •17.1.1 Класс Directory
- •Пример: Создадим приложение, позволяющее создавать, удалять, переименовывать папки, а также определять их наличие.
- •Реализуем приложение с компонентами button1..button4 и textbox1
- •На событие Click компонента button1 будем создавать папку с именем из textBox1 в
- •На событие Click компонента button2 будем проверять наличие папки с именем из textBox2
- •Почему?
- •17.1.2 Класс File
- •Пример: Применение методов класса
- •17.1.3 Класс FileSystemInfo
- •17.1.4 Класс DirectoryInfo
- •17.1.5 Множество FileAttributes
- •Пример:
- •17.1.6 Класс FileInfo
- •// Создаем новый файл.
- •17.2 Потоки данных
- •17.2.1 Потоки, связанные с файлами
- •17.2.2 Работа с двоичными файлами
- •В классе FileStream существует конструктор, позволяющий определить не только путь к файлу, но
- •После создания потока на базе файла (FileStream) следует на базе этого потока создать
- •Для записи в файл двоичных данных используется метод Write:
- •Для записи в файл двоичных данных используется метод Write:
- •Пример: создание двоичного файла, запись и чтение данных
- •// чтение из файла
- •17.2.3 Работа текстовыми файлами
- •Если открыть наш файл в блокноте, то получится следующее:
- •Непонятна также и запись текста этих строк. Проблема в том, что существуют различные
- •Кодировка указывается как статическое свойство класса System.Text.Encoding.
17.2.1 Потоки, связанные с файлами
Для потоков, связанных с файлами, определено также такое понятие, как текущая позиция внутри файла.
Перед началом операций ввода-вывода программа должна открыть поток. При этом текущая позиция устанавливается на начало файла. При чтении файла или записи в файл блоков данных текущая позиция сдвигается к концу файла на количество байтов, равное размеру прочитанного или
записанного блока данных. При помощи средств позиционирования программа может установить текущую позицию в произвольное место файла. Когда работа с файлом закончена, программа обязательно должна закрыть соответствующий поток явным образом.
Если вам нужно создать входной или выходной поток, связанный с локальным файлом, содержащим двоичные
данные, следует воспользоваться классами BinaryWriter и BinaryReader.
Для чтения из файла или записи в файл текстовых данных обычно используются классы StreamReader и StreamWriter.
17.2.2 Работа с двоичными файлами
Для работы с двоичными файлами вначале следует создать поток класса Filestream, воспользовавшись соответствующим конструктором, например:
FileStream fs =
new FileStream("myfile.dat",
FileMode.CreateNew);
В качестве первого параметра конструктору необходимо передать полный путь к файлу или имя файла, а в качестве
второго — режим открытия потока. Виды режимов:
Append – если файл существует, он открывается. Текущая позиция устанавливается на конец файла. Если указанного файла нет, то он создается. Этот режим можно использовать
только совместно с режимом доступа FileAccess.Write. Create – ОС должна создать новый файл. Если указанный файл уже существует, он будет перезаписан.
Open – Требуется открыть существующий файл. Указатель
ставится на начало файла.
Truncate – Требуется открыть существующий файл. После
В классе FileStream существует конструктор, позволяющий определить не только путь к файлу, но и режим его открытия:
FileStream fs = new FileStream(name,
FileMode.Open,
FileAccess.Read);
Режим доступа задается как статическая константа класса FileAccess.
Read Доступ только на чтение ReadWrite Доступ на чтение и запись Write Доступ на запись
После создания потока на базе файла (FileStream) следует на базе этого потока создать потоки классов BinaryWriter и BinaryReader, предназначенные соответственно для записи в
файл и чтения из файла двоичных данных:
BinaryWriter bw = new BinaryWriter(fs); BinaryReader br = new BinaryReader(fs);
После того как программа завершила работу с потоками, она должна их закрыть. Для закрытия потоков используется метод Close.
Закрываются потоки в порядке, обратном открытию:
FileStream fs = new FileStream("myfile.dat",
FileMode.CreateNew);
BinaryWriter bw = new BinaryWriter(fs); BinaryReader br = new BinaryReader(fs);
// Работа с потоками
bw.Close();
br.Close();
Для записи в файл двоичных данных используется метод Write:
Write(<параметр>);
При этом параметр должен иметь один из стандартных типов данных (bool, byte , int, long, double, float, char, string и др.). Параметром может быть массив целых чисел или символов:
Write(byte[]);
Write(char[]);
Можно записать только часть массива:
Write(byte[], <from>, <count>);
Write(char[], <from>, <count>);
где <from> и <count> целые числа, указывающие с какого индекса начать и сколько элементов записать.
При записи в двоичный поток текстовой строки string она будет предваряться префиксом, содержащим значение длины строки. Строка будет записана в кодировке ASCII.
Чтобы прочитать данные из потока BinaryReader, нужно использовать один из методов, специально предусмотренных для этого в классе BinaryReader. Например: ReadByte(),
ReadChar(), ReadDouble() и т.п.
Для записи в файл двоичных данных используется метод Write:
Write(<параметр>);
При этом параметр должен иметь один из стандартных типов данных (bool, byte , int, long, double, float, char, string и др.). Параметром может быть массив целых чисел или символов:
Write(byte[]);
Write(char[]);
Можно записать только часть массива:
Write(byte[], <from>, <count>);
Write(char[], <from>, <count>);
где <from> и <count> целые числа, указывающие с какого индекса начать и сколько элементов записать.
При записи в двоичный поток текстовой строки string она будет предваряться префиксом, содержащим значение длины строки. Строка будет записана в кодировке ASCII.
Чтобы прочитать данные из потока BinaryReader, нужно использовать один из методов, специально предусмотренных для этого в классе BinaryReader. Например: ReadByte(),
ReadChar(), ReadDouble() и т.п.
Пример: создание двоичного файла, запись и чтение данных
string testFile = @"d:\MyData.dat"; if(File.Exists(testFile))
{
MessageBox.Show("Файл " + testFile + " уже существует" );
return;
}
// Создание файла и запись чисел FileStream fs = new FileStream(testFile, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs); bw.Write("Text
for(int i = 0;
{
bw.Write(i);
}
bw.Close();
// чтение из файла
fs = new FileStream(testFile, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs); string s = br.ReadString();
int k;
for (int i=0; i < 10; i++)
{
k = br.ReadInt32();
s += k.ToString() + "\n";
};
br.Close();
fs.Close();
MessageBox.Show("Содержимое файла + testFile + "\n" + s );
17.2.3 Работа текстовыми файлами
В принципе, потоки FileStream, BinaryWriter и BinaryReader можно использовать для записи в файлы и чтения из файлов текстовых строк, однако, лучше применять специально предназначенные для этого потоки классов StreamWriter и StreamReader. Эти потоки чрезвычайно просты в использовании и удобны для работы с текстовыми файлами.
Приемы использования потоков StreamWriter и StreamReader рассмотрим на примере записи в файл и чтения из него набора строк:
private void button2_Click(object sender, EventArgs e)
{
string testFile = @"d:\MyData.txt"; if (File.Exists(testFile))
{
MessageBox.Show("Файл " + testFile + " уже существует");
return;
}
StreamWriter sw = File.CreateText(testFile); sw.Write("Строка 1\n"); sw.WriteLine("Строка 2");
sw.WriteLine("0 1 2 3 4 5 6 7 8 9"); sw.Close();
string s = "";
StreamReader sr = File.OpenText(testFile); while (true)
{
string str = sr.ReadLine(); if (str == null) break;
s += str+"\n";
}
sr.Close();
MessageBox.Show("Содержимое файла "
+ testFile + "\n" + s);