확장성 때문이라도 GetFileSizeEx를 써야 할거 같네요.
[출처]
http://sar1rat0.tistory.com/category/%EB%81%84%EC%A0%81%EC%9D%B4%EB%8A%94%20%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B3%B5%EB%B6%80
[퍼옴]
64bit와 32bit 에서 동시에 파일 사이즈 구하기
끄적이는 컴퓨터 공부 2009/01/12 22:52 by sar1rat0
파일 사이즈를 구하는 함수가 있습니다. 그 이름하여 GetFileSize();
API 인데 이름이 굉장히 직관적이어서 너무 좋습니다. 이런 함수를 사용할 때는 너무나 기분이 좋습니다.
그냥 적당히 때려 맞추면 비주얼 어시스트가 알아서 찾아주고, 그걸 구글에서 검색해서 사용 방법을 익히면
되기 때문이죠.
그런데 GetFileSize() 함수에 시대흐름 상 결함이 존재하였으니, 64bit에서 파일을 사이즈를 가져 오지
못합니다. MSDN을 보면 GetFileSizeEx() 함수를 사용하라고 권하고 있습니다. 그래서 한 번 살펴보았습
니다.
BOOL WINAPI GetFileSizeEx(
__in HANDLE hFile,
__out PLARGE_INTEGER lpFileSize
);
PLARGE_INTEGER 에 파일 사이즈가 들어갑니다. 저 파일타입은 union입니다. 궁금해서 살펴보았습
니다.
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
#endif //MIDL_PASS
LONGLONG QuadPart;
} LARGE_INTEGER;
typedef LARGE_INTEGER *PLARGE_INTEGER;
* LARGE_INTEGER Union
멤버 설명은 다음과 같습니다. 64bit는 QuadPart를 사용하고 32bit는 나머지를 사용합니다.
Members
LowPart
Low-order 32 bits.
HighPart
High-order 32 bits.
u
LowPart
Low-order 32 bits.
HighPart
High-order 32 bits.
QuadPart
Signed 64-bit integer.
그래서 이렇게 사용하면 되겠습니다.
PLARGE_INTEGER pLargeInteger;
if ( INVALID_FILE_SIZE != ::GetFileSizeEx(hFile, pLargeInteger) )
{
// 64bit인 경우
printf("64bit file size = %d\n", pLargeInteger.QuadPart );
// 32bit인 경우
printf("32bit file size = %d\n", pLargeInteger.LowPart );
}
//<----- 여기까지가 퍼온글이구요...