Application/MFC

[MFC] File Read / Write Overlapped 사용법

devsalix 2024. 8. 8. 15:40
반응형

파일 읽고 / 쓸때 Overlapped 사용 방법에 대한 자료 입니다

 

 

1. 파일 읽기

 

BOOL DataFileRead(CString strPath, LARGE_INTEGER liPos, DWORD &rdwRet, BYTE *pData)
{
	BOOL bRet = FALSE;
	OVERLAPPED OverlapRead;

	memset(&OverlapRead, NULL, sizeof(OverlapRead));
	
	HANDLE hFile = CreateFile(strPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		// 파일 열기 실패
		return bRet;
	}
	
	OverlapRead.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	OverlapRead.Offset = liPos.LowPart;
	OverlapRead.OffsetHigh = liPos.HighPart;

	if(ReadFile(hFile, pData, DF_MAX_SIZE, NULL, &OverlapRead) == FALSE)
	{
		if(GetLastError() != ERROR_IO_PENDING)
		{
			// 파일 읽기 오류 [IO Pending 오류]
			
			SetEvent(OverlapRead.hEvent);
			CloseHandle(OverlapRead.hEvent);
			OverlapRead.hEvent = NULL;

			CloseHandle(hFile);
			return bRet;
		}
	}
	
	if(WaitForSingleObject(OverlapRead.hEvent, INFINITE) == WAIT_OBJECT_0)
	{
		if (GetOverlappedResult(hFile, &OverlapRead, &rdwRet, TRUE))
		{
			bRet = TRUE;
		}
		else
		{
			// 파일 읽기 오류 [GetOverlappedResult 오류]
		}
	}
	else
	{
		// 파일 읽기 오류 [WaitForSingleObject 오류]
	}

	CloseHandle(hFile);

	SetEvent(OverlapRead.hEvent);
	CloseHandle(OverlapRead.hEvent);
	OverlapRead.hEvent = NULL;

	return bRet;
}

 

 

2. 파일 쓰기

 

BOOL DataFileWrite(CString strPath, LARGE_INTEGER liPos, DWORD dwSize, BYTE *pData)
{
	BOOL bRet = FALSE;
	HANDLE hFile;
	OVERLAPPED OverlapWrite;
	LARGE_INTEGER liPos;
	DWORD dwWrite;

	memset(&OverlapWrite, NULL, sizeof(OverlapWrite));

	hFile = CreateFile(strPath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		// 파일 열기 실패
		return bRet;
	}
	
	OverlapWrite.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	OverlapWrite.Offset = liPos.LowPart;
	OverlapWrite.OffsetHigh = liPos.HighPart;

	if(WriteFile(hFile, pData, dwSize, NULL, &OverlapWrite) == FALSE)
	{
		if(GetLastError() != ERROR_IO_PENDING)
		{
			// 파일 쓰기 오류 [IO Pending 오류]
			SetEvent(OverlapWrite.hEvent);
			CloseHandle(OverlapWrite.hEvent);
			OverlapWrite.hEvent = NULL;

			CloseHandle(hFile);
			return bRet;
		}
	}
	
	if(WaitForSingleObject(OverlapWrite.hEvent, INFINITE) == WAIT_OBJECT_0)
	{
		if (GetOverlappedResult(hFile, &OverlapWrite, &dwWrite, TRUE))
		{
			if(dwSize == dwWrite)
			{
				bRet = TRUE;
			}
			else
			{
				// 파일 쓰기 오류 [Write Size 오류]
			}
		}
		else
		{
			// 파일 쓰기 오류 [GetOverlappedResult 오류]
		}
	}
	else
	{
		// 파일 쓰기 오류 [WaitForSingleObject 오류]
	}
	

	SetEvent(OverlapWrite.hEvent);
	CloseHandle(OverlapWrite.hEvent);
	OverlapWrite.hEvent = NULL;

	CloseHandle(hFile);
	return bRet;
}

 

 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
반응형