Использование Маппинга (Mapping) для больших файлов
файлы могут быть и больше 4 гигов
Вроде всё понятно НО немогу совершенно понять как использовать Mapping и View файла
точнее как организовать чтения определённой части файла
мне ведь надо сранить файлы и даже 10 Мб текста загружать уже много
речь идёт именно о больших файлах
буду рад принять маленький рабочий пример отрытия большго файла
А в чём проблема?.. Функция WinAPI ReadFile() вам не подходит?.. У неё указывается, сколько байт следует прочитать из файла.
Код:
__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);
}
{
// начальные границы представлений всегда начинаются 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);
}