C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Обработка исключений, при файловом вводе/выводе
AdeLka
Отправлено: 15.11.2006, 14:00


Ученик-кочегар

Группа: Участник
Сообщений: 7



Подскажите, как лучше обрабатывать исключения, возникающие при открытии, чтении и записи файла, если использую функции CreateFile, ReadFile и WriteFile? Хочется отлавливать моменты с открытием несуществующего файла, неправильным путем и т.д.
Doga
Отправлено: 15.11.2006, 15:03


Мастер участка

Группа: Участник
Сообщений: 575



До таких ситуаций, однозначно, лучше не доводить.
Используйте FileExists и DirectoryExists.
AdeLka
Отправлено: 15.11.2006, 16:23


Ученик-кочегар

Группа: Участник
Сообщений: 7



Спасибо за совет!
Grigoriy
Отправлено: 15.11.2006, 17:49


Мастер участка

Группа: Участник
Сообщений: 381



Для функции CreateFile
QUOTE

HANDLE CreateFile(

   LPCTSTR lpFileName, // pointer to name of the file
   DWORD dwDesiredAccess, // access (read-write) mode
   DWORD dwShareMode, // share mode
   LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
   DWORD dwCreationDistribution, // how to create
   DWORD dwFlagsAndAttributes, // file attributes
   HANDLE hTemplateFile  // handle to file with attributes to copy  
  );

Return Values
If the function succeeds, the return value is an open handle to the specified file. If the specified file exists before the function call and dwCreationDistribution is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS (even though the function has succeeded). If the file does not exist before the call, GetLastError returns zero.
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.

То есть при ошибке создания нового файла или ошибке открытия существующего функция возвращает INVALID_HANDLE_VALUE, что численно равно -1.

Для функции ReadFile
QUOTE

BOOL ReadFile(

   HANDLE hFile, // handle of file to read
   LPVOID lpBuffer, // address of buffer that receives data  
   DWORD nNumberOfBytesToRead, // number of bytes to read
   LPDWORD lpNumberOfBytesRead, // address of number of bytes read
   LPOVERLAPPED lpOverlapped  // address of structure for data
  );

Return Values
If the function succeeds, the return value is nonzero.
If the return value is nonzero and the number of bytes read is zero, the file pointer was beyond the current end of the file at the time of the read operation. However, if the file was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the return value is FALSE and GetLastError returns ERROR_HANDLE_EOF when the file pointer goes beyond the current end of file.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

То есть это означает, что при ошибке функция ReadFile возвращает 0.
Эта ситуация может возникнуть, если файл не открыт для чтения, например. А вообще количество прочитанных байт возвращается в 4-байтной ячейке памяти по адресу
CODE

LPDWORD lpNumberOfBytesRead, // address of number of bytes read


Для функции WriteFile аналогично тому что и для функции ReadFile.

Отредактировано Grigoriy — 15.11.2006, 17:50

Вернуться в Вопросы программирования в C++Builder