2GBを超えるファイルのサイズ取得について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

2GBを超えるファイルのサイズ取得について

#1

投稿記事 by 初心者 » 9年前

c言語のstat関数で、ファイルのサイズを取得しているのですが
2GBを超えると、マイナスになってしまいます。
WinXP、32bit なのですが、define等で回避する方法はないでしょうか。

linuxのgccだと、defineで回避できるようなのですが、、、

また、stat以外でも2GB以上のファイルサイズを取得する方法について
ご存知の方がいましたら、ご教示下さい。。。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 2GBを超えるファイルのサイズ取得について

#2

投稿記事 by ISLe » 9年前

unsigned longにキャストすればいちおう期待する数値になりますけど。

VCでは_stat64(あるいは_stati64)を使うと64ビット長でファイルサイズを取得でき、4GB越えにも対応します。

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 2GBを超えるファイルのサイズ取得について

#3

投稿記事 by みけCAT » 9年前

GetFileSize() APIを使いましょう。

コード:

#include <stdio.h>
#include <windows.h>

int main(int argc,char* argv[]) {
	HANDLE fp;
	DWORD low;
	DWORD high;
	unsigned long long size;
	if(argc<2) {
		printf("第一引数にファイル名を指定してください。\n");
		return 1; 
	}
	fp=CreateFile(argv[1],GENERIC_READ,0,NULL,
		OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
	if(fp==INVALID_HANDLE_VALUE) {
		printf("ファイルオープンに失敗しました。\n");
		return 1; 
	}
	low=GetFileSize(fp,&high);
	size=(unsigned long long)low | (unsigned long long)high<<32;
	CloseHandle(fp);
	printf("ファイルサイズは%lluバイトです。\n",size);
	printf("%lluキロバイトです。\n",size/1024);
	printf("%lluメガバイトです。\n",size/1024/1024);
	printf("%lluギガバイトです。\n",size/1024/1024/1024);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 2GBを超えるファイルのサイズ取得について

#4

投稿記事 by ISLe » 9年前

せっかくなのでVCとgccの両方で使えるコードを書いてみました。

コード:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef _MSC_VER
#define stat _stati64
#endif
int main(int argc, char *argv[])
{
	int i;
	struct stat st;
	for (i=1; i<argc; i++) {
		if (stat(argv[i], &st) == 0) {
			printf("%s -> %llu bytes\n", argv[i], st.st_size);
		}
	}
	return 0;
}
【追記】
Ubuntuで64ビット版のとき書式指定(%llu)と実引数の型(long(64ビット))で食い違いになりました。

閉鎖

“C言語何でも質問掲示板” へ戻る