Обработка исключительных ситуаций при работе с файлами
Операции по открытию файлов могут завершиться неудачно, например, при ошибке в имени существующего файла или отсутствии свободного места на диске, поэтому рекомендуется всегда контролировать результаты этих операций. В случае непредвиденных ситуаций среда выполнения генерирует различные исключения, обработку которых следует предусмотреть в программе, например:
FileNotFoundException, если файла с указанным именем в указанном каталоге не существует;
DirectoryNotFoundException, если не существует указанный каталог;
ArgumentEception, если неверно задан режим открытия файла;
IOException, если файл не открывается из-за ошибок ввода-вывода.
Удобно обрабатывать наиболее вероятные ошибки раздельно, чтобы предоставить пользователю программы в выводимом сообщении наиболее точную информацию. В приведенном далее примере отдельно перехватывается ошибка в имени файла, а затем обрабатывается все остальные возможные ошибки:
try
{
FileStream f=new FileStream( @"d:\C#\text.txt",
FileMode.Open, FileAccess.Read);
... //действия над файлом
f.Close();
}
catch(FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла! ");
return;
}
catch(Exception e)
{
Console.WriteLine("Error: " + e.Message);
return; }
При закрытии файла освобождаются все связанные с ним ресурсы, например, для файла, открытого для записи, в файл выгружается содержимое буфера. Поэтому рекомендуется всегда закрывать файлы после окончания работы, в особенности файлы, открытые для записи.
Символьные потоки - классы StreamWriter и StreamReader работают с Unicode-символами, следовательно, ими удобнее всего пользоваться для работы с файлами, предназначенными для восприятия человеком. Эти потоки являются наследниками классов TextWriter и TextReader соответственно. В таблицах 11.5 и 11.6 приведены основные элементы этих классов. Произвольный доступдля текстовых файлов не поддерживается.
Таблица 11.5 – Основные элементы класса TextWriter
Close Закрыть файл и освободить связанные с ним ресурсы. Если в процессе
записи используется буфер, он будет очищен
Flush Очистить все буферы для текущего файла и записать накопленные
в них данные в место их постоянного хранения. Сам файл при этом
не закрывается
NewLine Используется для задания последовательности символов, означающих
начало новой строки. По умолчанию используется последовательность
«возврат каретки» - «перевод строки» (\r\n)
Write Записать фрагмент текста в поток
WriteLine Записать строку в поток и перейти на другую строку
Таблица 11.6 - Основные элементы класса TextReader