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

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002144.docx

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

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

 

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


 

рис.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


 

буферы для данного потока.

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;

}

}


 

args[]


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

 

{

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();

}

}