м я вас не пойму , зачем вам знать размер выходного файла. Если вы его будете по кускам составлять?)
Пример из того же Рихтера :
| Код | __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); }
|
|