где 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
(указан неверный режим), SecurityException
(у пользователя нет прав доступа к файлу), 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 доступ)