var file_, map : dword;
buf: pointer;
begin
file_ := CreateFile('c:\file1.txt', GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, 0, 0);
if file_ <> INVALID_HANDLE_VALUE thentry
map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil);
if map <> 0 thentry
buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if buf <> nilthentry// now here you have your file1.txt in memory// beginning at pointer "buf"finally UnmapViewOfFile(buf) end;
finally CloseHandle(map) end;
finally CloseHandle(file_) end;
end;
{
This logic maps your complete file into memory. It's not COPIED into memory,
only MAPPED. In the moment where you access the single bytes of the file in
memory, Windows internally reads the file for you in the fastest possible way.
}
Код на Delphi! Это пример использования функций CreateFile, CreateFileMapping и MapViewOfFile из Windows API для маппинга файла в память.
Маппит файл в память с помощью функции MapViewOfFile. Флаг FILE_MAP_ALL_ACCESS позволяет иметь доступ на чтение и запись к маппированной памяти.
Затем код доступается к файлу в памяти через указатель buf.
Когда закончено с файлом, код вызывает:
UnmapViewOfFile(buf) для десмаппинга файла из памяти.
CloseHandle(map) для закрытия объекта маппинга файла.
CloseHandle(file_) для закрытия обрабатываемого файла.
Основной момент здесь в том, что файл не копируется в память; вместо этого он маппируется. Это означает, что Windows будет читать файл с диска только когда вы доступитесь к конкретным частям файла в памяти. Это может быть более эффективно, чем загружать весь файл в память целиком.
Обратите внимание, что код не обрабатывает ошибки или исключения должным образом. В реальном мире вам нужно добавить правильное обрабатывание ошибок, чтобы ваш программный продукт поведал себя правильно даже если возникнут проблемы с файловой системой или функциями Windows API.
В статье описывается пример маппинга файла в память с помощью функций CreateFileMapping и MapViewOfFile из библиотеки Windows API, что позволяет доступиться к содержимому файла как к виртуальному массиву.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.