![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Чтение и запись двоичных файлов
(потоковый файловый ввод-вывод)
На уровне операционной системы все файлы обрабатываются на побайтовой основе. рис.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
Исключения:
Пример.
FileStream fin; fin = new FileStream(" test.dat", FileMode.Open);
Если необходимо ограничить доступ только чтением или только записью, используйте следующий конструктор:
FileStream (string filename, FileMode mode, FileAccess how)
Значения перечисления FileAccess
Пример.
FileStream fin; fin = new FileStream(" test.dat", FileMode.Open, FileAccess.Read);
Закрытие файла
void Close() – объектный метод
Пока файл не закрыт, его не могут использовать другие программы. Любые данные, оставшиеся в дисковом буфере, будут переписаны на диск, ресурсы освободятся.
Открытое свойство: Length – длина файла.
Чтение/запись байтов
Открытые методы класса FileStream
ЧТЕНИЕ: Можно прочитать любой файл. Чтобы прочитать из файла один байт:
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].
Исключения:
Если вы хотите записать данные на физическое устройство вне зависимости от того, полон буфер или нет, вызовите следующий метод:
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(); } }
|