複数のメモリブロックのファイルへの書き込み(C言語)

説明:

WriteFileGatherを使用することにより、複数のメモリブロックを一気にまとめてファイルに書き込む。(この例では、入力データは連続したメモリブロックであるが、WriteFileGatherには不連続のメモリブロックをまとめて書き込む能力がある)

キーワード:

GetSystemInfo, VirtualAlloc, CreateFile, CreateEvent, WriteFileGather, WaitForSingleObject, VirtualFree

サンプルコード:

#define PAGE_NUM 4096

void WriteBuffers()
{
	HANDLE hFile;
	BYTE *BufList[PAGE_NUM];
	FILE_SEGMENT_ELEMENT SegElement[PAGE_NUM + 1];
	SYSTEM_INFO si;
	OVERLAPPED ov;
	BYTE *BaseAddress;
	DWORD i;

	/* 書き込むデータの用意 */
	GetSystemInfo(&si);
	BaseAddress  = VirtualAlloc(NULL, si.dwPageSize * PAGE_NUM, MEM_COMMIT, PAGE_READWRITE);

	for(i=0; i<PAGE_NUM; i++) {
		BufList[i] = BaseAddress + si.dwPageSize * i;
		FillMemory(BufList[i], si.dwPageSize, i % 256);
	}

	/* ファイルの作成 */
	hFile = CreateFile(
		"test.dat",
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_ALWAYS,
		FILE_ATTRIBUTE_ARCHIVE | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
		NULL);

	/* WriteFileGatherへの入力情報の初期化 */
	for(i=0; i<PAGE_NUM; i++) SegElement[i] = (FILE_SEGMENT_ELEMENT)BufList[i];
	SegElement[PAGE_NUM] = (FILE_SEGMENT_ELEMENT)NULL;
	
	ov.Offset = 0;
	ov.OffsetHigh = 0;
	ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	/* ファイルへ書き込み */
	printf("書き込み開始.\n");
	WriteFileGather(hFile, SegElement, PAGE_NUM * si.dwPageSize, NULL, &ov);

	printf("待機中...\n");
	WaitForSingleObject(ov.hEvent, INFINITE);

	printf("完了.\n");
	
	/* 後処理 */
	CloseHandle(hFile);
	VirtualFree(BaseAddress, 0, MEM_RELEASE);
	CloseHandle(ov.hEvent);
}
(original text:1999/02/10 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。