Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Пример отображаемых в памяти файлов

Delphi , Файловая система , Файлы

Пример отображаемых в памяти файлов


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 then
    try
      map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil);
      if map <> 0 then
        try
          buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
          if buf <> nil then
            try

              // 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 для маппинга файла в память.

Вот шаг за шагом, что код делает:

  1. file_ := CreateFile('c:\file1.txt', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
    • Создаёт обрабатываемый файл для файла 'c:\file1.txt' с доступом только на чтение.
  2. map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil);
    • Создает объект маппинга файла, который maps файл в память. Файл маппится для чтения и записи (PAGE_READWRITE).
  3. buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    • Маппит файл в память с помощью функции MapViewOfFile. Флаг FILE_MAP_ALL_ACCESS позволяет иметь доступ на чтение и запись к маппированной памяти.
  4. Затем код доступается к файлу в памяти через указатель buf.
  5. Когда закончено с файлом, код вызывает:
    • UnmapViewOfFile(buf) для десмаппинга файла из памяти.
    • CloseHandle(map) для закрытия объекта маппинга файла.
    • CloseHandle(file_) для закрытия обрабатываемого файла.

Основной момент здесь в том, что файл не копируется в память; вместо этого он маппируется. Это означает, что Windows будет читать файл с диска только когда вы доступитесь к конкретным частям файла в памяти. Это может быть более эффективно, чем загружать весь файл в память целиком.

Обратите внимание, что код не обрабатывает ошибки или исключения должным образом. В реальном мире вам нужно добавить правильное обрабатывание ошибок, чтобы ваш программный продукт поведал себя правильно даже если возникнут проблемы с файловой системой или функциями Windows API.

В статье описывается пример маппинга файла в память с помощью функций CreateFileMapping и MapViewOfFile из библиотеки Windows API, что позволяет доступиться к содержимому файла как к виртуальному массиву.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 20:00:41/0.0035159587860107/0