2013-11-15 3 views
2

Windows에서 xfs 파일 시스템을 구문 분석 할 작은 유틸리티를 작성하고 있습니다. 작은 이미지의 경우 < 5GB 내 유틸리티가 잘 작동 중입니다. 모든 파일과 디렉토리를 나열 할 수 있습니다. 그러나 큰 xfs 이미지> 30GB를 구문 분석하려고 할 때. 그것은 잘못된 결과를주고 있습니다. 저는 seek과 fread에서 _fseeki64와 _ftelli64를 사용하여 특정 블록을 읽습니다. 주목할 점은 _fseeki64가 제대로 작동하지 않는다는 것입니다. 다음은 특정 그룹 번호와 블록 번호를 찾는 내 탐색 기능입니다.Windows에서 C++로 대용량 파일 찾기

그러나 위의 기능은 나를 잘못된 위치로 안내합니다. 예를 들어 나는 그룹 번호에 m_fileSystemInfo.SizeOfBlockGroup = 2043982 및 m_fileSystemInfo.BlockSize = 4096

내가 기대하고있어 currPrt = * 4096 2,043,982 * 2 = 16,744,300,544 (0x3E609C000), 그러나 _ftelli64와 = 2를 추구 할 때 반환됩니다 (0xE609C000). 무엇이 잘못 될 수 있는지 제안하십시오. 또한 C++의 윈도우에서 대용량 파일을 처리하는 가장 좋은 방법은 무엇입니까?

는 업데이트 ::

나는 나 대신 (0x3e609c000) inspite가 __int64을 16,744,300,544 사용의 실제 값의 seekOffset가 8,154,365,952 (0x1e609c000)로 제한지고 있음을 발견했다.

So.

는 _ * 4096 INT64 seekOff = ( _int64) (grpNum * m_fileSystemInfo.SizeOfBlockGroup * m_fileSystemInfo.BlockSize) = 2 * 2043982 대신 16744300544.

의 8154365952를주고 내가 무엇을 할 수 확실하지 않다 모든 것이 __int64에있는 이유.

답변

2

Win32 API를 직접 사용하고 C 런타임을 사용하지 않는 것이 가장 좋습니다.

사용 CreateFile 파일을 열하고 SetFilePointerEx

어쨌든 이러한 API를 호출 끝날 것입니다 전화하는거야 기능을 추구 할 수 있습니다. Visual Studio에서는 CRT 코드가 있으므로 _fseeki64에 들어가서 잘못 된 부분을 볼 수 있습니다.

+0

2 * 2043982 * 4096의 오프셋 계산이 실제 값 16744300544 대신 8154365952로 제한된다는 것을 알았습니다. 대부분의 장소에서 __int64를 사용했지만 도움이되지 않습니다. – praks411

3

분명히 문제는 시크 오프셋 계산 때문이었습니다. 정수 오버 플로우가 발생했습니다. 64 비트 응용 프로그램에서 작업하고 있기 때문에 모든 것을 __int64로 변환해야합니다. 나는 컴파일러가 나를 위해 이것을 할 수있을 거라 생각했다.

__int64 grpNum = 2; 
__int64 sizeOfBlockGroup = 2043982; 
__int64 blockSize = 4096; 
__int64 seekOffSet = grpNum*sizeOfBlockGroup*blockSize; 

_fseeki64 및 __ftelli64와 잘 작동합니다.

+0

64 비트 창에 사용되는 메모리 모델에서 포인터는 64 비트이지만 32 비트 정수입니다. 또한 모든 값을 __int64로 만들 필요는 없습니다. A * B가 32 비트보다 크면 A 또는 B 중 하나가 __int64인지 확인해야합니다. – Stuart