Application/MFC

[MFC] WriteFile & ReadFile & OVERLAPPED 사용 방법

devsalix 2023. 3. 17. 13:22
728x90

비동기로 파일 입/출력을 하기 위해서는 Overlapped 를 사용해야 합니다

 

간단한 사용법을 소개합니다

 

우선 헤더 파일에 변수 선언을 진행합니다

 

OVERLAPPED m_overlapped;

 

이후 초기화 및 Event 초기화를 진행합니다

 

MyClass()
{
	memset(&m_overlapped, NULL, sizeof(m_overlapped));
	m_overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
}

 

소멸자에서도 처리해 줍니다

 

~MyClass()
{
	SetEvent(m_overlapped.hEvent);
	CloseHandle(m_overlapped.hEvent);
	m_overlapped.hEvent = NULL;
}

 

그리고 마지막으로 아래와 같이 정의하면 파일 쓰기가 됩니다

 

BOOL MyClass::FileWriteFunc(BYTE *pData, DWORD dwSize)
{
	LARGE_INTEGER liPos
	HANDLE hFile = CreateFile(_T("파일 위치"), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	
	if(hFile == INVALID_HANDLE_VALUE)
	{
		//파일 열기 실패
		return FALSE;
	}
	
	//파일 쓰려는곳의 위치
	liPos.QuadPart = 0;
	
	m_overlapped.Offset = liPos.LowPart;
	m_overlapped.OffsetHigh = liPos.HighPart;

	if(WriteFile(hFile, pData, dwSize, NULL, &m_overlapped) == FALSE)
	{
		if(GetLastError() != ERROR_IO_PENDING)
		{
			//정상 처리 실패
			CloseHandle(hFile);
			return FALSE;
		}
	}

	Sleep(0);
	if(WaitForSingleObject(m_overlapped.hEvent, INFINITE) != WAIT_OBJECT_0)
	{
		//정상 처리 오류
		CloseHandle(hFile);
		return FALSE;
	}
	
	CloseHandle(hFile);
	return TRUE;
}

 

읽기도 위와 같은 방식으로 처리 하면됩니다

 

 


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

 

 
728x90
반응형