Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

File Mapping

62K
11 августа 2010 года
Gambler-Sanek
3 / / 11.08.2010
Приветствую всех! Ребят, такая проблема. Нужно замапить большой файл и считать кусок. 2 дня уже мучаюсь, не знаю где ошибка. Делаю все вот так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var hFile1: THandle;
    hMap : THandle;
    buff: Pointer;
begin
hFile1:=CreateFile('D:\123123123.txt',
            GENERIC_ALL,
            FILE_ATTRIBUTE_READONLY,
            NIL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            0);
hMap:=CreateFileMapping(hFile1,
                        Nil,
                        PAGE_READONLY,
                        0,
                        0,
                        nil);
buff := MapViewOfFile(hMap,
                      FILE_MAP_READ,
                      0,
                      0,
                      [COLOR="Red"]256[/COLOR]);
if buff = nil then exit;
Memo1.text:=PChar(buff);
UnmapViewOfFile(buff);
CloseHandle(hMap);
CloseHandle(hFile1);
end;

Вот если выделенное заменить на 0, то все работает, но читается весь файл. А если он больше 4 Гб? Что я делаю не так?

Только что заметил особенность: вес файла 4939 байт, если в качестве выделенного параметра указать число от 4097 до 4939 - выводит весь файл. Меньше - ошибка. Больше - buff = nil
62K
12 августа 2010 года
Gambler-Sanek
3 / / 11.08.2010
Сам разобрался. Косяк был не в мапировании, а в копировании области памяти. Забыл эту область заранее выделить.
14
12 августа 2010 года
Phodopus
3.3K / / 19.06.2008
Зачем GENERIC_ALL если FILE_MAP_READ?
К чему FILE_ATTRIBUTE_READONLY в аргументе не для того предназначенном?
exit посреди процедуры может привести к handle-leak.

Цитата: Gambler-Sanek
А если он больше 4 Гб?


на 32х разрядных системах ему "достаточно" быть поменьше 2 Гб чтобы не промаппиться.

62K
13 августа 2010 года
Gambler-Sanek
3 / / 11.08.2010
это кусок программы, так что на счет exit можно не переживать. Его нет. За атрибуты чтения - спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог