Чтение и запись двоичных файлов
(потоковый файловый ввод-вывод)
На уровне операционной системы все файлы обрабатываются на по- байтовой основе.
![]() |
рис.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();
}
}
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.