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

Ваш аккаунт

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

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

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

Использование mapping

9.1K
27 сентября 2006 года
pnz
27 / / 24.04.2006
Прошу помощи у тех, кто знает как пользовать маппингом при чтении из файла? Если можно, то с примерами, или с ссылками где можно про это почитать(желательно на руссом).

Заранее спасибо!!!
257
27 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
вроде так: сначала идет CreateFile, потом CreateFileMapping или OpenFileMapping и следом MapViewOfFile. в итоге получишь начальный адрес отображенного файла, с ним и надо работать, т.е. перемещаться и т.д. если ты собираешься читать всегда одно и тоже число байт или ассоциировать указатель с определенными данными(т.е. сделаешь указателем на определенную структуру), то надо конечно использовать маппинг, в других случаях проще ReadFile. а вообще смотри мсдн.
284
28 сентября 2006 года
michael_is_98
587 / / 25.02.2005
[QUOTE=pnz]Прошу помощи у тех, кто знает как пользовать маппингом при чтении из файла? Если можно, то с примерами, или с ссылками где можно про это почитать(желательно на руссом).

Заранее спасибо!!![/QUOTE]
Код:
// открытие файла как mapping
// возвр. 0 в случае ошибки
// fn - имя файла (ввод)
// nach - начальный адрес mapped view (вывод)
// razmer - размер файла (вывод)
int OtkritFileMap(const char*const fn, LPVOID &nach,int &razmer)
{
    int result;

    HANDLE  hFile,hMapObj;BOOL b;

    hFile=CreateFile(fn,
                    GENERIC_READ,
                    FILE_SHARE_READ,
                    NULL,
                    OPEN_EXISTING,
                    FILE_FLAG_NO_BUFFERING|FILE_FLAG_SEQUENTIAL_SCAN,
                    NULL);
    razmer=GetFileSize(hFile,NULL);
    if (!hFile)
        return 0;

    hMapObj=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
    b=CloseHandle(hFile);

    if (!hMapObj)
    {
        result=GetLastError();//ERROR_ALREADY_EXISTS
        return 0;
    }

    nach=MapViewOfFile(hMapObj,FILE_MAP_READ, 0,0,0);
    b=CloseHandle(hMapObj);

    if (!nach)
    {
        result=GetLastError();
        return 0;
    }

    return 1;
}

// закрывает map-файл
// nach - начальный адрес mapped view (ввод)
void ZakritFileMap(LPCVOID nach)
{
    BOOL b=UnmapViewOfFile(nach);
}

Когда получаешь начальный адрес mapped view можешь использовать его для чтения байт как будто это указатель на строку. Только не забудьте его сохранить для последующего вызова ZakritFileMap!

P.S. Для чтения содержимого файла важна задача. Для быстрого чтения map-файл не лучшее решение. Во-первых, map-файл привязан к ОС (в Unix его нет), во-вторых, его использование возлагает функции буферизации чтения на саму ОС. Т.е. можно самому продумать буферизацию при чтении файла и эта функция будет работать быстрее, чем map-файл.
350
03 октября 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=michael_is_98]P.S. Для чтения содержимого файла важна задача. Для быстрого чтения map-файл не лучшее решение. Во-первых, map-файл привязан к ОС (в Unix его нет), во-вторых, его использование возлагает функции буферизации чтения на саму ОС. Т.е. можно самому продумать буферизацию при чтении файла и эта функция будет работать быстрее, чем map-файл.[/QUOTE]
Вряд ли можно придумать "буферизацию" быстрее, чем это реализует сама ОС. По сути, это не буферизация, а тот же механизм, что используется при свопинге. Содержимое давно не неиспользованных страниц сбрасывается в файл, причём только тогда, когда эти страницы нужны другим - сможешь самостоятельно реализовать подобную схему? В случае с отображением файлов на память используются аппаратные механизмы процессора - исключение отказа страницы, что и обеспечивает эффективную работу механизма.
284
03 октября 2006 года
michael_is_98
587 / / 25.02.2005
[QUOTE=cheburator]Вряд ли можно придумать "буферизацию" быстрее, чем это реализует сама ОС. По сути, это не буферизация, а тот же механизм, что используется при свопинге. Содержимое давно не неиспользованных страниц сбрасывается в файл, причём только тогда, когда эти страницы нужны другим - сможешь самостоятельно реализовать подобную схему? В случае с отображением файлов на память используются аппаратные механизмы процессора - исключение отказа страницы, что и обеспечивает эффективную работу механизма.[/QUOTE]
Все идет от задачи...
Для конкретной задачи можно реализовать быстрое чтение даже без использования FileMap. Например, я для своей задачи использовал FileMap, чтение C-функциями (fread), чтение низкоуровневыми функциями windows (из <io.h>), потоковый ввод-вывод. И пришел к выводу, что важно не столько, какие функции используются, сколько качество этих функций (которое определяется используемым компилятором) и продуманная буферизация. Я отказался от FileMap, когда нужно было побайтово читать файл. При этом приходится каждый раз смотреть, не вышел ли ты за границы файла (не превысил ли размер). Надобность в подобной проверке отпадает когда программист сам организует буферизацию, идущую от задачи.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог