Чтение и запись из представления данных файла


Чтобы читать из представления данных файла, разименуйте указатель, возвращенный функцией MapViewOfFile как показано в примере ниже:

DWORD dwLength;

dwLength = *((LPDWORD) lpMapAddress);

Процесс также использует указатель, возвращенный MapViewOfFile, чтобы и записать в представление данных файла:

*((LPDWORD) lpMapAddress) = dwLength;

Функция FlushViewOfFile копирует заданное число байтов представления данных файла в физический файл, не ожидая когда произойдет кэшируемая операция записи:

if (!FlushViewOfFile(lpMapAddress, dwBytesToFlush)) 
{
    printf("Could not flush memory to disk (%d).\n", GetLastError()); 
}

Чтение из или запись в представление данных файла могут вызвать исключительную ситуацию. Например, обращение к отображаемому файлу, который находится на удаленном сервере, может генерировать исключительную ситуацию, если связь с сервером потеряна. Исключения могут также произойти и из-за переполнения диска, сбоя базового устройства, или сбоя в распределении памяти. При записи в представление данных файла, исключения могут также произойти, потому что файл совместно используется и другой процесс захватил блок байтов. Чтобы принять меры против исключительных ситуаций из-за ошибок ввода и вывода данных (I/O), все попытки доступа к отображаемым в памяти файлам должны быть тесно связаны со структурными обработчиками исключительных ситуации.

Если Вы отображаете сжатый или разреженный файл в разделе NTFS, то есть дополнительная возможность для ошибки ввода - вывода (I/O), когда происходит страничная подкачка  в части файла. В этой ситуации, адресное пространство, отображаемое MapViewOfFile не может резервироваться распределенным дисковым пространством. Это происходит потому, что разреженный  файл может иметь зоны нулей, для которых NTFS, не назначает дисковое пространство и сжатый файл может занять меньше дискового пространства, чем фактически нужно для данных, которые он представляет. Если Вы читаете из или записываете в часть разреженного или сжатого файла, который не поддерживается дисковым пространством, операционная система может сделать попытку назначить дисковое пространство. Если диск является заполненным, это может привести к исключению, указывающему на ошибку ввода - вывода (I/O). Дополнительную информацию, см. Сжатие файла и восстановление сжатого файла, Разреженные файлы и Структурная обработка исключений.

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz