폴더 사용량 확인을 위한 프로그램 제작 중 MFC 의 CFileFind 클래스의 멤버 함수 GetLength64() 에 버그가 있음을 알게 되었다.

버그 내용은 4기가 이상의 파일의 크기를 정확하게 반환하지 못한다는 것이다.
구체적으로 DWORD high 값과 low 값중에 high 값이 제대로 반환되지 않는다. 그래서 실제로 4.4기가 같으면 400메가가 얻어지게 되어 버린다.

버그를 고치는 방법은 API를 사용하는 방법과 CFileFind 클래스를 서브 클래싱하여 오버라이딩하는 방법이 있다.

여기에서는 오버라이딩하는 방법을 소개한다.

실제 CFileFind 함수의 GetLength64() 함수는 아래와 같이 구현되어 있다.

42: __int64 CFileFind::GetLength64() const
43: {
44: ASSERT(m_hContext != NULL);
45: ASSERT_VALID(this);
46:
47: if (m_pFoundInfo != NULL)
48: return ((LPWIN32_FIND_DATA) m_pFoundInfo)->nFileSizeLow +
49: (((LPWIN32_FIND_DATA) m_pFoundInfo)->nFileSizeHigh << 32);
50: else
51: return 0;
52: }

이것을 아래와 같이 서브 클래싱하여 오버라이딩 하면 4기가 이상의 파일도 이상없이 파일용량을 구할 수 있다.

29: __int64 CMyFileFind::GetLength64() const
30: {
31: ASSERT(m_hContext != NULL);
32: ASSERT_VALID(this);
33:
34: if (m_pFoundInfo != NULL)
35: return ((LPWIN32_FIND_DATA)m_pFoundInfo)->nFileSizeLow +
36: ((unsigned __int64)((LPWIN32_FIND_DATA)m_pFoundInfo)->nFileSizeHigh << 32);
37: else
38: return 0;
39: }
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기