Программирование на языке MFC

Мой второй блог в серии программирования
08.02.2010

Тем не менее, мы может прекратить работу архива в любое время при помощи метода Abort(), исходный текст которого находится в файле агссоге.срр:

void CArchive::Abort() {

ASSERT(m_bDirectBuffer ||

m_lpBufStart == NULL || AfxIsValidAddress(m_lpBufStart,

m_lpBufMax – m_lpBufStart, IsStoring()));

ASSERT(m_bDirectBuffer ||

m_lpBufCur == NULL || AfxIsValidAddress(m_lpBufCur,

m_lpBufMax – m_lpBufCur, IsStoring()));

// disconnect from the file mjpFile = NULL;

if (!m_bUserBuf) {

ASSERT(!m_bDirectBuffer); delete[] m_lpBufStart; m_lpBufStart = NULL; m_lpBufCur = NULL;

}

delete m_pSchemaMap; m_pSchemaMap = NULL;

// m_pStoreMap and m_pLoadArray are unioned, // so we only need to delete one

ASSERT((CObject*)m_pStoreMap == (CObject*)m_pLoadArray); delete (CObject*)m_pLoadArray; m_pLoadArray = NULL;Посмотрим, что происходит с архивом в случае прекращения работы посредством вызова метода AbortQ. Первым делом метод «отсоединяет» архив от файла, присваивая полю m__pFile значе­ние NULL. Затем в том случае, если у архива есть ассоциированный с ним буфер, производится удаление буфера. Если в буфере остались данные, которые не были записаны в файл, то эти данные будут потеряны. Указатели на начало буфера и на текущую позицию буфера делаются равными NULL. Затем удаляется указатель на хэш-таблицу, содержащую номера схем классов, а за ней и хэш-таблица (или массив) сохраненных объектов.



03.02.2010

Метод закрывает ассоциированный с объектом поток, что автоматически приводит и к закрытию файла, «очищает» зна­чения полей m_hFile и тjpStream. В случае возникновении ошиб­ки при закрытии потока формируется исключение.

В том случае, если для программиста не очень важно, закрылся поток нормально или с ошибкой, программист может воспользо­ваться методом Abort(), текст которого приведен ниже:

void CStdioFile::Abort() {

ASSERT_VALID(this);

if (m_pStream != NULL && m_bCloseOnDelete)

fclose(m_pStream); // close but ignore errors m_hFile = (UINT) hFileNull; m_pStream = NULL; m_bCloseOnDelete = FALSE;

Как и метод Close(), метод Abort() закрывает поток, обнуляет поля m_hFile и m_pStream, но в случае возникновения ошибки при за­крытии потока никаких исключений не формируется.