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
|
|
|