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

Ваш аккаунт

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

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

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

Использование Маппинга (Mapping) для больших файлов

51K
31 января 2010 года
AlexMarlo
14 / / 31.01.2010
Вобщем нужно написать программу сравенния очень больших файлов на чистом WinApi на C
файлы могут быть и больше 4 гигов
Вроде всё понятно НО немогу совершенно понять как использовать Mapping и View файла
точнее как организовать чтения определённой части файла
мне ведь надо сранить файлы и даже 10 Мб текста загружать уже много
речь идёт именно о больших файлах
буду рад принять маленький рабочий пример отрытия большго файла
24K
31 января 2010 года
engel65536
50 / / 17.10.2007
А в чём проблема?.. Функция WinAPI ReadFile() вам не подходит?.. У неё указывается, сколько байт следует прочитать из файла.
51K
31 января 2010 года
AlexMarlo
14 / / 31.01.2010
всё найден пример у Рихтера
Код:
__int64 Count0s(void)
{
    // начальные границы представлений всегда начинаются no адресам,
    // кратным гранулярности выделения памяти
    SYSTEM_INFO sinf;
    GetSystemInfo(&sinf);
    // открываем файл данных
    HANDLE hFile = CreateFile( "С:\\HugeFile.Big ", GENERIC_READ, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 
    HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    DWORD dwFileSizeHigh;
    __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
    qwFileSize += (((__int64) dwFileSizeHigh) << 32);
    // доступ к описателю объекта файл нам больше не нужен
    CloseHandle(hFile);
    __int64 qwFileOffset = 0;
    qwNumOf0s = 0;
    while (qwFileSize > 0) {
        // определяем, сколько байтов надо спроецировать
        DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
        if (qwFileSize < sinf.dwAllocationGranularity)
            dwBytesInBlock = (DWORD)qwFileSize;
        PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ,
            (DWORD) (qwFileOffset >> 32), // начальный байт
            (DWORD) (qwFileOffset & 0xFFFFFFFF), // в файле
            dwBytesInBlock); // число проецируемых байтов
        // подсчитываем количество нулевых байтов в этом блоке
        for (DWORD dwByte = 0; dwByte < dwBytesInBlock; dwByte++) {
            if (pbFile[dwByte] == 0)
                qwNumOf0s++;
        }
        // прекращаем проецирование представления, чтобы в адресном пространстве
        // не образовалось несколько представлений одного файла
        UnmapViewOfFile(pbFile);
        // переходим к следующей группе байтов в файле
        qwFileOffset += dwBytesInBlock;
        qwFileSize -= dwBytesInBlock;
    }
    CloseHandle(hFileMapping);
    return(qwNumOf0s);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог