開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 test
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

4GB以上のファイルを_tstatに渡すとエラーになる。

test1.c
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
 
int _tmain()
{
	static char	acBuffer[1024 * 1024];	// staticにしないとスタックオーバーフロー
	FILE*		pFile;
	size_t		sizeWrite;
	int		i;
 
	if (_tfopen_s(&pFile, _T("test.bin"), _T("wb")) != 0) {
		_ftprintf(stderr, _T("error: _tfopen_s\n"));
		return 1;
	}
	SecureZeroMemory(acBuffer, sizeof acBuffer);
	for (i = 0; i < 2048; i++) {
		sizeWrite = fwrite(acBuffer, sizeof acBuffer[0], _countof(acBuffer), pFile);
		if (sizeWrite != _countof(acBuffer)) {
			_ftprintf(stderr, _T("error: fwrite\n"));
			return 1;
		}
	}
	_fcloseall();
	return 0;
}
 

test2.c
#include <tchar.h>
 
int _tmain()
{
	struct _stat	stat;		// _stat64i32
	struct _stati64	stati64;	// _stat64
	int		iRet;
 
	// ファイルサイズが4GB未満
	iRet = _tstat(_T("test2GB.bin"), &stat);
	if (iRet != 0) {
		_ftprintf(stderr, _T("error: _tstat %d\n"), iRet);
		return 1;
	}
	_tprintf(_T("%#x %u\n"), stat.st_size, stat.st_size);
 
	// ファイルサイズが4GB以上
	iRet = _tstati64(_T("test4GB.bin"), &stati64);
	if (iRet != 0) {
		_ftprintf(stderr, _T("error: _tstati64 %d\n"), iRet);
		return 1;
	}
	_tprintf(_T("%#llx %llu\n"), stati64.st_size, stati64.st_size);
 
	return 0;
}
 

実行
0x80000000 2147483648
0x100000000 4294967296
最終更新:2012年09月01日 16:48