반응형
파일 읽고 / 쓸때 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;
}
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
반응형
'Application > MFC' 카테고리의 다른 글
[MFC] 통신 프로그램 기초 (Socket 함수 사용) (0) | 2024.11.16 |
---|---|
[MFC] 클립보드 활용 (Clipboard) (0) | 2024.11.13 |
[MFC] 중복 실행 방지 (HANDLE, Event) (0) | 2024.04.09 |
[MFC] CImage 오류 : Detach() (0) | 2024.04.03 |
[MFC] Button Text Multiline (버튼 글자 줄 바꿈) (2) | 2024.01.29 |