Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Использование Маппинга (Mapping) для больших файло


Автор: AlexMarlo 31.1.2010, 16:34
Вобщем нужно написать программу сравенния очень больших файлов на чистом WinApi на C
файлы могут быть и больше 4 гигов
Вроде всё понятно НО немогу совершенно понять как использовать Mapping и View файла  
точнее как организовать чтения определённой части файла
мне ведь надо сранить файлы и даже 10 Мб текста загружать уже много
речь идёт именно о больших файлах
буду рад принять маленький рабочий пример отрытия большго файла

Автор: bra1ny 31.1.2010, 17:12
У того же Рихтера есть пример как работать с большими файлами.
Вот пример из книги там файл мапится частями .

Код

__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); 
}

Автор: AlexMarlo 31.1.2010, 17:36
огромное спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)