Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.76 Mб
Скачать

Пример программы для работы с двоичным файлом

Программа Binary демонстрирует некоторые приемы работы с двоичными файлами при помощи классов FileStream, BinaryWriter и BinaryReader.

using System;

using System.IO;

namespace Binary

{

class Program

{

static string testFile = "mydata.dat";

static void Main(string[] args)

{

if(File.Exists(testFile))

{

Console.WriteLine("Файл {0} уже существует", testFile);

Console.ReadLine();

return;

}

FileStream fs = new FileStream(testFile, FileMode.CreateNew);

BinaryWriter bw = new BinaryWriter(fs);

bw.Write("Text string");

for(uint i = 0; i < 20; i++)

{

bw.Write(i);

}

bw.Close();

fs.Close();

fs = new FileStream(testFile, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fs);

string s = br.ReadString();

Console.WriteLine(s);

for (uint i = 0; i < 20; i++)

{

Console.Write("{0} ", br.ReadUInt32());

}

br.Close();

fs.Close();

Console.WriteLine("\nФайл успешно создан");

Console.ReadLine();

}

}

}

В самом начале своей работы программа проверяет существование файла с именем mydata.dat, используя для этого метод Exists класса File:

if(File.Exists(testFile))

{

Console.WriteLine("Файл {0} уже существует", testFile);

Console.ReadLine();

return;

}

Класс File, предназначенный для работы с файлами и каталогами, мы рассмотрим позже. Пока же мы только заметим, что данный фрагмент кода проверяет существование файла mydata.dat в каталоге, который был текущим при запуске нашей программы на выполнение. Если такой файл там уже существует (например, был создан при предыдущем запуске этой программы), программа завершает свою работу с сообщением об ошибке.

Если же в текущем каталоге нет файла с именем mydata.dat, программа создает его, вызывая для этого конструктор класса FileStream с соответствующими параметрами:

FileStream fs = new FileStream(testFile, FileMode.CreateNew);

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

После создания потока FileStream, связанного с файлом, мы создаем поток bw класса BinaryWriter, предназначенный для записи в файл двоичных данных:

BinaryWriter bw = new BinaryWriter(fs);

На следующем шаге программа записывает в поток текстовую строку:

bw.Write("Text string");

Далее программа записывает в поток bw 20 чисел типа uint:

for(uint i = 0; i < 20; i++)

{

bw.Write(i);

}

После завершения записи оба потока закрываются методом Close:

bw.Close();

fs.Close();

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

Для этого она вначале открывает поток fs класса FileStream, указывая, что файл должен быть открыт только для чтения:

fs = new FileStream(testFile, FileMode.Open, FileAccess.Read);

Режим чтения задается константой FileAccess.Read. Далее на базе потока fs программа создает поток br класса Binary.Reader:

Binary.Reader br = new BinaryReader(fs);

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

string s = br.ReadString();

Console.WriteLine(s);

Далее она в цикле считывает 20 чисел и также отображает их на консоли:

for (uint i = 0; i < 20; i++)

{

Console.Write("{0} ", br.ReadUInt32());

}

Завершив работу с потоками, программа закрывает их:

br.Close();

fs.Close();

Далее она выводит на консоль сообщение об успешном создании файла и ждет, когда пользователь нажмет клавишу Enter, чтобы завершить свою работу:

Console.WriteLine{"\nФайл успешно создан");

Console.ReadLine();

Вот что появится на консоли после запуска программы:

Содержимое файла, созданного данной программой, можно просмотреть с помощью двоичного редактора или файлового коммандера. Используя Total Commander, можно просмотреть содержимое файла как в текстовом, так и в двоичном режиме. В текстовом режиме содержимое файла выглядит как

В этом режиме анализ содержимого файла достаточно затруднителен. Удобнее переключить программу просмотра в двоичный режим:

Обратите внимание, что в самом начале файла находится байт со значением 0х0В, вслед за которым идет текстовая строка в кодировке ASCII. Этот байт задает длину строки. Вслед за строкой идут 20 чисел, каждое из которых занимает 4 байта.

Управление каталогами

В библиотеке классов Microsoft .NET Framework предусмотрено мощное средство работы с каталогами — класс Directory. С помощью методов этого класса программа может выполнять такие действия, как получение списка логических дисков, определение текущего каталога, просмотр содержимого каталогов, создание и удаление каталогов, проверка их существования и пр.

Список логических дисков

Чтобы получить список всех логических дисков, имеющихся в системе, воспользуйтесь методом Directory.GetLogicalDrives:

string[ ] drives = Directory.GetLogicalDrives();

foreach(string s in drives)Console.Write("{0} ", s);

Этот метод не имеет параметров. После выполнения он возвращает ссылку на массив текстовых строк вида «С:\» с обозначениями всех доступных логических дисковых устройств.

Текущий каталог

С помощью метода Directory.GetCurrentDirectory программа может определить полный путь к текущему каталогу:

string currentDir = Directory.GetCurrentDirectory();

Console.WriteLine{"\пТекущий каталог: {0}", currentDir);

Метод возвращает этот путь в виде текстовой строки класса string.

При необходимости программа может определить диск, на котором находится текущий или любой другой каталог. Для этого она должна воспользоваться методом Directory.GetDirectoryRoot, передав ему в качестве параметра путь к нужному каталогу:

string directoryRoot = Directory.GetDirectoryRoot(currentDir);

Console.WriteLine("Корень диска с текущим каталогом: {0}",directoryRoot);