Чтение онлайн

ЖАНРЫ

Полное руководство. С# 4.0
Шрифт:

где путь обозначает имя открываемого файла, включая полный путь к нему; а ре жим — порядок открытия файла. В последнем случае указывается одно из значений, определяемых в перечислении FileMode и приведенных в табл. 14.4. Как правило, этот конструктор открывает файл для доступа с целью чтения или записи. Исключе нием из этого правила служит открытие файла в режиме FileMode.Append, когда файл становится доступным только для записи.

Таблица 14.4. Значения из перечисления FileMode Значение Описание FileMode.Append Добавляет выводимые данные в конец файла FileMode.Create Создает новый выходной файл. Существующий файл с таким же именем будет разрушен FileMode.CreateNew Создает

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

Если попытка открыть файл оказывается неудачной, то генерируется исклю чение. Если же файл нельзя открыть из-за того что он не существует, генерируется исключение FileNotFoundException. А если файл нельзя открыть из-за какой- нибудь ошибки ввода-вывода, то генерируется исключение IOException. К чис лу других исключений, которые могут быть сгенерированы при открытии фай ла, относятся следующие: ArgumentNullException (указано пустое имя файла), ArgumentException (указано неверное имя файла), ArgumentOutOfRangeException (указан неверный режим), SeaurityException (у пользователя нет прав доступа к файлу), PathTooLongException (слишком длинное имя файла или путь к нему), NotSupportedException (в имени файла указано устройство, которое не поддержи вается), а также DirectoryNotFoundException (указан неверный каталог).

Исключения PathTooLongException, DirectoryNotFoundException и FileNotFoundException относятся к подклассам класса исключений IOException. Поэтому все они могут быть перехвачены, если перехватывается исключение IOException.

Ниже в качестве примера приведен один из способов открытия файла test.dat для ввода. FileStream fin; try { fin = new FileStream("test", FileMode.Open); } catch(IOException exc) { // перехватить все исключения, связанные с вводом-выводом Console.WriteLine(exc.Message); // Обработать ошибку. } catch(Exception exc { // перехватить любое другое исключение. Console.WriteLine(exc.Message); // Обработать ошибку, если это возможно. // Еще раз сгенерировать необрабатываемые исключения. }

В первом блоке catch из данного примера обрабатываются ошибки, возникающие в том случае, если файл не найден, путь к нему слишком длинен, каталог не существу ет, а также другие ошибки ввода-вывода. Во втором блоке catch, который является "универсальным" для всех остальных типов исключений, обрабатываются другие веро ятные ошибки (возможно, даже путем повторного генерирования исключения). Кроме того, каждую ошибку можно проверять отдельно, уведомляя более подробно о ней и принимая конкретные меры по ее исправлению.

Ради простоты в примерах, представленных в этой книге, перехватывается только ис ключение IOException, но в реальной программе, скорее всего, потребуется перехва тывать и другие вероятные исключения, связанные с вводом-выводом, в зависимости от обстоятельств. Кроме того, в обработчиках исключений, приводимых в качестве примера в этой главе, просто уведомляется об ошибке, но зачастую в них должны быть запрограм мированы конкретные меры по исправлению ошибок, если это вообще возможно. Напри мер, можно предложить пользователю еще раз ввести имя файла, если указанный ранее файл не был найден. Возможно, также потребуется сгенерировать исключение повторно.

Как упоминалось выше, конструктор класса FileStream открывает файл, доступный для чтения или записи. Если же требуется ограничить доступ к файлу только для чтения или же только для записи, то в таком случае следует использовать такой конструктор. FileStream(string путь, FileMode режим, FileAccess доступ)

Как и прежде, путь обозначает имя открываемого файла,

включая и полный путь к нему, а режим — порядок открытия файла. В то же время доступ обозначает кон кретный способ доступа к файлу. В последнем случае указывается одно из значений, определяемых в перечислении FileAccess и приведенных ниже. FileAccess.Read FileAccess.Write FileAccess.ReadWrite

Например, в следующем примере кода файл test.dat открывается только для чтения. FileStream fin = new FileStream("test.dat", FileMode.Open, FileAccess.Read);

По завершении работы с файлом его следует закрыть, вызвав метод Close. Ниже приведена общая форма обращения к этому методу. void Close

При закрытии файла высвобождаются системные ресурсы, распределенные для этого файла, что дает возможность использовать их для другого файла. Любопытно, что метод Close вызывает, в свою очередь, метод Dispose, который, собственно, и высвобождает системные ресурсы.

ПРИМЕЧАНИЕ Оператор using, рассматриваемый в главе 20, предоставляет еще один способ закры тия файла, который больше не нужен. Такой способ оказывается удобным во многих случаях обращения с файлами, поскольку гарантирует закрытие ненужного больше файла простыми средствами. Но исключительно в целях демонстрации основ обращения с файлами, в том числе и того момента, когда файл может быть закрыт, во всех примерах, представленных в этой главе, используются явные вызовы метода Close. Чтение байтов из потока файлового ввода-вывода

В классе FileStream определены два метода для чтения байтов из файла: ReadByte и Read. Так, для чтения одного байта из файла используется метод ReadByte, общая форма которого приведена ниже. int ReadByte

Всякий раз, когда этот метод вызывается, из файла считывается один байт, который затем возвращается в виде целого значения. К числу вероятных исключений, которые генерируются при этом, относятся NotSupportedException (поток не открыт для ввода) и ObjectDisposedException (поток закрыт).

Для чтения блока байтов из файла служит метод Read, общая форма которого выглядит так. int Read(byte[ ] array, int offset, int count)

В методе Read предпринимается попытка считать количество count байтов в массив array, начиная с элемента array[offset]. Он возвращает количество бай тов, успешно считанных из файла. Если же возникает ошибка ввода-вывода, то гене рируется исключение IOException. К числу других вероятных исключений, которые генерируются при этом, относится NotSupportedException. Это исключение гене рируется в том случае, если чтение из файла не поддерживается в потоке.

В приведенном ниже примере программы метод ReadByte используется для ввода и отображения содержимого текстового файла, имя которого указывается в ка честве аргумента командной строки. Обратите внимание на то, что в этой программе проверяется, указано ли имя файла, прежде чем пытаться открыть его. /* Отобразить содержимое текстового файла. Чтобы воспользоваться этой программой, укажите имя того файла, содержимое которого требуется отобразить. Например, для просмотра содержимого файла TEST.CS введите в командной строке следующее: ShowFile TEST.CS */ using System; using System.IO; class ShowFile { static void Main(string[] args) { int i; FileStream fin; if(args.Length != 1) { Console.WriteLine("Применение: ShowFile Файл"); return; } try { fin = new FileStream(args[0], FileMode.Open); } catch(IOException exc) { Console.WriteLine("He удается открыть файл"); Console.WriteLine(exc.Message); return; // Файл не открывается, завершить программу } // Читать байты до конца файла. try { do { i = fin.ReadByte; if(i != -1) Console.Write((char) i); } while(i != -1); } catch(IOException exc) { Console.WriteLine("Ошибка чтения файла"); Console.WriteLine(exc.Message); } finally { fin.Close; } } }

Поделиться с друзьями: