개발 Q&A

제목 [MFC] CFileFind 를 이용하여 여러 DAT 파일을 읽어오고 Byte로 저장하는데 액세스 위반이 발생하였습니다.
카테고리 기타
글쓴이 AlwaysBeginner 작성시각 2022/04/19 11:46:24
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 4674   RSS

언어는 MFC 이고 Visual Studio로 작업하였습니다. 

작성한 코드는 특정경로에 있는 DAT 파일을 CFileFind로 불러와 해당 각 배열에 Byte로 저장하는 코드입니다. 

여기서 각 배열은 구조체로 선언되었고 배열의 크기는 파일의 용량이 변함에 따라 동적으로 할당하고 있습니다.

 

void CMultiDATToByteDlg::LoadDATFile()
{
	CFileFind fileFinder;
 
	BOOL bFind = fileFinder.FindFile(m_strRelayFilePath + "\\ToIDS" + "\\*.dat*");
 
	int nFileCount = 0;
	while (bFind)
	{
		bFind = fileFinder.FindNextFile();
		if (fileFinder.IsDots())
			continue;
		nFileCount++;
 
		CStdioFile DATFile;
		CString  DATFile_Name = fileFinder.GetFileTitle();
		int  DATFile_Length = fileFinder.GetLength();
		byte*  DATFile_Data = (byte*)malloc(sizeof(byte)* DATFile_Length);
 
		if (DATFile.Open(fileFinder.GetFilePath(), CFile::modeRead))
		{
			DATFile.Read(DATFile_Data, DATFile_Length);
			DATFile.Close();
 
			int nListIndex = 0;
			while (true)
			{
				POSITION pos = m_DATFileList.FindIndex(nListIndex);
				if (m_DATFileList.GetCount() == 0 || pos == NULL)
				{
					DATFileObject *pDATFileObject = new DATFileObject;
 
					pDATFileObject->m_DATFile_Name = DATFile_Name;
					pDATFileObject->m_DATFile_Length = DATFile_Length;
					pDATFileObject->m_DATFile_Data = (byte*)malloc(sizeof(byte)* pDATFileObject->m_DATFile_Length);
					memcpy(pDATFileObject->m_DATFile_Data, DATFile_Data, pDATFileObject->m_DATFile_Length);
 
					m_DATFileList.AddTail(pDATFileObject);
 
					DataObject* pDataObject = new DataObject;
					pDataObject->m_strIP = pDATFileObject->m_DATFile_Name;
					m_DataObjectList.AddTail(pDataObject);
					break;
				}
				else
				{
					DATFileObject* pDATFileObject = (DATFileObject*)m_DATFileList.GetAt(pos);
					if (DATFile_Name == pDATFileObject->m_DATFile_Name)
					{
						pDATFileObject->m_DATFile_Length = DATFile_Length;
						free(pDATFileObject->m_DATFile_Data);
						pDATFileObject->m_DATFile_Data = (byte*)malloc(sizeof(byte)* pDATFileObject->m_DATFile_Length);
						memcpy(pDATFileObject->m_DATFile_Data, DATFile_Data, pDATFileObject->m_DATFile_Length);
 
						m_DATFileList.SetAt(pos, pDATFileObject);
						break;
					}
					else nListIndex++;
				}
			}
		}
		free(DATFile_Data);
	}
	fileFinder.Close();
	DATFileToData();
}
void CMultiDATToByteDlg::DATFileToData()
{
	DATFileObject* pDATFileObject = NULL;
	DataObject* pDataObject = NULL;
	POSITION pos = m_DATFileList.GetHeadPosition();
	while (pos != NULL)
	{
		pDATFileObject = (DATFileObject*)m_DATFileList.GetNext(pos);
		for (int nIndex = 0; nIndex < m_DataObjectList.GetCount(); nIndex++)
		{
			pDataObject = (DataObject*)m_DataObjectList.GetAt(m_DataObjectList.FindIndex(nIndex));
			if (pDATFileObject->m_DATFile_Name == pDataObject->m_strIP)
				break;
		}
		pDataObject->m_Data = (byte*)malloc(sizeof(byte)* pDATFileObject->m_DATFile_Length);
		memcpy(pDataObject->m_Data, pDATFileObject->m_DATFile_Data, pDATFileObject->m_DATFile_Length);
		m_DataObjectList.SetAt(pos, pDataObject);
	}
}

위와 같이 작성하고 실행하였으나 

CopyUpLargeMov:
        bt      __favor, __FAVOR_ENFSTRG        ; check if Enhanced Fast Strings is supported
        jnc     CopyUpSSE2Check                 ; if not, check for SSE2 support
        rep     movsb
        mov     eax,[esp + 0Ch]                 ; return original destination pointer
        pop     esi
        pop     edi
        M_EXIT

액세스 위반 문구가 나옵니다... 혹시 조언 좀 구할 수 있을까요? 

 다음글 페이지 로드시 에러 메세지 입니다 (1)
 이전글 Error: CCI, -20016, Cannot con... (4)

댓글

변종원(웅파) / 2022/04/22 15:52:26 / 추천 0

codeigniter(php framework)에 대한 포럼이고 기타 개발이라도 php일반, 서버 등에 대해 답변을 합니다.

윈도우 프로그램 질문은 해결해주실 만한 분이 없을 겁니다.