/* Открыть и отобразить входной и выходной файлы. */
hIn = CreateFile(fIn, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hInMap = CreateFileMapping(hIn, NULL, PAGE_READONLY, 0, 0, NULL);
pInFile = MapViewOfFile(hInMap, FILE_MAP_READ, 0, 0, 0);
dwOut = bFailIfExists ? CREATE NEW : CREATE ALWAYS;
hOut = CreateFile(fOut, GENERIC_READ | GENERIC_WRITE, 0, NULL, dwOut, FILE_ATTRIBUTE_NORMAL, NULL);
FsLow = GetFileSize (hIn, NULL); /* Установить размер отображения. */
hOutMap = CreateFileMapping(hOut, NULL, PAGE_READWRITE, 0, 2* FsLow, NULL);
pOutFile = MapViewOfFile(hOutMap, FILE_MAP_WRITE, 0, 0, (SIZE_T)(2 * FsLow));
/* Преобразовать данные отображенного файла из ASCII в Unicode. */
pIn = pInFile;
pOut = pOutFile;
while (pIn < pInFile + FsLow) {
*pOut = (WCHAR) *pIn;
pIn++;
pOut++;
}
UnmapViewOfFile(pOutFile);
UnmapViewOfFile(pInFile);
CloseHandle(hOutMap);
CloseHandle(hInMap);
CloseHandle(hIn);
CloseHandle(hOut);
return TRUE;
}
Пример: сортировка отображенных файлов
Дополнительным преимуществом метода отображения файлов является то, что он допускает применение обычных алгоритмов обработки файлов в памяти компьютера. Так, сортировку данных в памяти осуществить гораздо легче, чем сортировку записей в файле.
Программа 5.4 предназначена для сортировки файлов с записями фиксированной длины. Данная программа, sortFL, аналогична программе 5.1 в том отношении, что предполагает наличие 8-байтового ключа сортировки в начале записи, но ограничивается записями фиксированной длины. В программе 5.5 этот недостаток будет устранен за счет некоторого усложнения программы.
Сортировку выполняет описанная в файле
Структура программы достаточно проста. Сначала на основе временной копии входного файла создается объект отображения файла, затем создается единое представление объекта отображения файла в памяти, и, наконец, вызывается функция qsort. При этом какие-либо операции файлового ввода/вывода отсутствуют. Отсортированный файл направляется далее на стандартный вывод, причем в конце отображения файла добавляется нулевой символ.
/* Глава 5. sortFL. Сортировка файлов. Записи имеют фиксированную длину.*/
/* Использование: sortFL файл */
#include "EvryThng.h"
typedef struct _RECORD {
TCHAR Key[KEY_SIZE];
TCHAR Data[DATALEN];
} RECORD;
#define RECSIZE sizeof(RECORD)
int _tmain(int argc, LPTSTR argv[]) {
HANDLE hFile = INVALID_HANDLE_VALUE, hMap = NULL;
LPVOID pFile = NULL;
DWORD FsLow, Result = 2;
TCHAR TempFile[MAX_PATH];
LPTSTR pTFile;
/* Создать имя временного файла, предназначенного для хранения копии сортируемого файла, которая и подвергается сортировке. */
/* Можно действовать и по-другому, оставив файл в качестве постоянно хранимой сортируемой версии. */
_stprintf(TempFile, _T("%s%s"), argv[1], _Т(".tmp"));
CopyFile(argv[1], TempFile, TRUE);