Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Чтение и запись двоичных файлов






(потоковый файловый ввод-вывод)

 

На уровне операционной системы все файлы обрабатываются на побайтовой основе.

рис.6

Открытие файла (создание файлового потока)

Чтобы создать байтовый поток, связанный с файлом, можно создать объект класса FileStream.

 
 

 


рис.7

В классе FileStream определено несколько конструкторов. Чаще всего из них используется следующий:

 

FileStream (string filename, FileMode mode)

 

filename - путь к файлу, который необходимо открыть.

mode - режим открытия файла.

 

Этот конструктор открывает файл для доступа с разрешением чтения и записи.

 

Примеры путей: Буквальные литералы:

" c: \\MyDir\\MyFile.txt" @" c: \MyDir\MyFile.txt"

" c: \\MyDir" @" c: \MyDir"

" MyDir\\MySubdir" @" MyDir\MySubdir"

" \\\\MyServer\\MyShare" @" \\MyServer\MyShare"

 

Таблица. Значения перечисления FileMode

Значение Описание
FileMode.Append Добавляет выходные данные в конец файла
FileMode.Create Создает новый выходной файл. Существующий файл с таким же именем будет разрушен
FileMode.CreateNew Создает новый выходной файл. Файл с таким же именем не должен существовать
FileMode.Open Открывает существующий файл
FileMode.OpenOrCreate Открывает файл, если он существует. В противном случае создает новый
FileMode.Truncate Открывает существующий файл, но усекает его длину до нуля

 

Исключения:

IOException файл невозможно открыть из-за ошибки ввода-вывода
FileNotFoundException файл невозможно открыть по причине его отсутствия
ArgumentNullException имя файла представляет собой null-значение
ArgumentException некорректен параметр mode
SecurityException пользователь не обладает правами доступа
DirectoryNotFoundException некорректно задан каталог

 

Пример.

 

FileStream fin;

fin = new FileStream(" test.dat", FileMode.Open);

 

Если необходимо ограничить доступ только чтением или только записью, используйте следующий конструктор:

 

FileStream (string filename, FileMode mode, FileAccess how)

 

Значения перечисления FileAccess

FileAccess.Read только читать
FileAccess.Write только писать
FileAccess.ReadWrite читать и писать

Пример.

 

FileStream fin;

fin = new FileStream(" test.dat", FileMode.Open, FileAccess.Read);

 

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

 

void Close() – объектный метод

 

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

Любые данные, оставшиеся в дисковом буфере, будут переписаны на диск, ресурсы освободятся.

 

Открытое свойство: Length – длина файла.

 

Чтение/запись байтов

 

Открытые методы класса FileStream

Flush   Переопределен. Инициирует запись всех буферизованных данных на основное устройство и очищает все буферы для данного потока.
Read Переопределен. Чтение блока байтов из потока и запись данных в заданный буфер.
ReadByte Переопределен. Считывание байта из файла и перемещение положение чтения на один байт.
Write Переопределен. Запись блока байтов в данный поток с использованием данных из буфера.
WriteByte Переопределен. Запись байта в текущую позицию в потоке файла.

 

ЧТЕНИЕ:

Можно прочитать любой файл. Чтобы прочитать из файла один байт:

 

int ReadByte()

 

Каждый прочитанный байт преобразуется в int. При обнаружении конца файла метод возвращает —1.

 

Чтобы считать массив байтов:

 

int Read (byte[ ] buf, int offset, int numBytes)

 

Метод Read() пытается считать numBytes байтов в массив buf, начиная с элемента buf[offset]. Он возвращает количество успешно считанных байтов.

 

ЗАПИСЬ:

Чтобы записать 1 байт в файл:

 

void WriteByte (byte val)

 

 

Чтобы записать в файл массив байтов:

 

void Write (byte[ ] buf, int offset, int numBytes)

 

Метод Write() записывает в файл numBytes байтов из массива buf, начиная с элемента buf [offset].

 

Исключения:

IOException ошибка ввода-вывода
NotSupportedException поток не открыт для ввода/вывода данных
ObjectDisposedException поток закрыт

 

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

 

void Flush ()

 

Пример. Копирование файла (без обработки исключений).

 

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

 

using System;

using System.IO;

 

class CopyFile

{

public static void Main(void)

{

int i;

FileStream fin, fout;

 

// Открываем входной файл.

fin = new FileStream (" c: \\source.txt", FileMode.Open);

 

// Открываем выходной файл.

fout = new FileStream (" c: \\target.txt", FileMode.Create);

 

// Копируем файл.

while (true)

{

i = fin.ReadByte();

if (i == -1) break;

fout.WriteByte ((byte)i);

}

 

fin.Close(); fout.Close();

}

}

 

Пример. Копирование файла с обработкой исключений.

Имена исходного и приемного файлов указываются в командной строке.

 

/*

Для использования этой программы укажите при запуске имя исходного и приемного файлов.

Например, чтобы скопировать файл FIRST.DAT в файл SECOND.DAT, используйте следующую командную строку:

 

CopyFile FIRST.DAT SECOND.DAT

 

*/

 

using System;

using System.IO;

 

class CopyFile

{

public static void Main(string[] args)

{

int i;

FileStream fin;

FileStream fout;

 

try

{

// Открываем входной файл.

try

{

i = 1;

fin = new FileStream (args[0], FileMode.Open);

}

 

catch (FileNotFoundException exc)

{

Console.WriteLine(exc.Message + " \nВходной файл не найден.");

return;

}

 

// Открываем выходной файл.

try

{

i = 2;

fout = new FileStream (args[1], FileMode.Create);

}

 

catch (IOException exc)

{

Console.WriteLine (exc.Message +

" \nОшибка при открытии выходного файла.");

return;

}

}

catch (IndexOutOfRangeException exc) // ошибка извлечения строки из массива args[]

{

Console.WriteLine(exc.Message +

" \nНе указано имя файла {0} в командной строке", i);

return;

}

 

// Копируем файл.

try

{

do

{

i = fin.ReadByte();

if (i! = -1) fout.WriteByte ((byte)i);

} while (i! = -1);

}

 

catch (IOException exc)

{

Console.WriteLine(exc.Message +

" Ошибка при чтении/записи файла.");

}

 

fin.Close();

fout.Close();

}

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.