На этом шаге мы рассмотрим пример, где реализовано побайтовое копирование файла.
В примере ниже представлена программа, при выполнении которой осуществляется побайтовое копирование файла: содержимое исходного (существующего) файла считывается байт за байтом и копируется в новый файл, который создается программой.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace pr293_1 { // Главный класс: class Program { // Главный метод: static void Main() { // Каталог с исходным файлом: string pathFrom = ""; // Каталог с новым файлом: string pathTo = ""; // Название исходного (копируемого) файла: string file="bear.jpg"; // Название для нового файла: string name="animal.jpg"; // Название и полный путь для файлов: string f = pathFrom + file; string F = pathTo + name; // Контролируемый код: try { // Создание потока для считывания файла: FileStream fin = new FileStream(f, FileMode.Open); Console.WriteLine("Исходный файл: \"{0}\"", f); // Создание потока для записи в файл: FileStream fout = new FileStream(F, FileMode.Create); Console.WriteLine("Hoвый файл: \"{0}\"", F); // Целочисленная переменная: int val; // Считывается первый байт из потока: val = fin.ReadByte(); // Чтение и запись байтов: while(val != -1) { // Запись байта в поток: fout.WriteByte((byte)val); // Считывается байт из потока: val = fin.ReadByte(); } // Закрываются потоки: fout.Close(); fin.Close(); } // Обработка исключений: catch(Exception e) { Console.WriteLine("Произошла ошибка!"); Console.WriteLine(e.Message); // Задержка: Console.ReadLine(); return; // Завершение выполнения программы } Console.WriteLine("Копирование успешно завершено"); // Задержка: Console.ReadLine(); } } }
При успешном выполнении программы в консольном окне появляются такие сообщения:
Рис.1. Результат работы приложения
Но главный результат выполнения программы иной: в каталоге bin/Debug проекта появляется файл animal.jpg, который является копией файла bear.jpg из этого же каталога.
В самой программе в текстовые переменные f и F записывается полный путь к исходному файлу и файлу, который должен быть создан в процессе копирования. Текстовая переменная f передается в качестве аргумента конструктору класса FileStream при создании объекта потока fin. Это поток используется для считывания содержимого исходного файла. Второй аргумент конструктора FileMode.Open означает, что речь идет об открытии существующего файла. Текстовая переменная F передается первым аргументом конструктору класса FileStream при создании объекта потока fout. Поток предназначен для записи байтовых данных в файл, который создается при создании объекта потока (поэтому вторым аргументом конструктору передана константа FileMode.Open).
Для запоминания считанных байтов мы используем переменную val типа int. Командой
val = fin.ReadByte();
fout.WriteByte((byte)val);
val = fin.ReadByte();
После завершения конструкции цикла, когда копирование выполнено, командами
fout.Close();
fin.Close();
На следующем шаге мы рассмотрим другой способ копирования файла.