c言語のstat関数で、ファイルのサイズを取得しているのですが
2GBを超えると、マイナスになってしまいます。
WinXP、32bit なのですが、define等で回避する方法はないでしょうか。
linuxのgccだと、defineで回避できるようなのですが、、、
また、stat以外でも2GB以上のファイルサイズを取得する方法について
ご存知の方がいましたら、ご教示下さい。。。
2GBを超えるファイルのサイズ取得について
Re: 2GBを超えるファイルのサイズ取得について
unsigned longにキャストすればいちおう期待する数値になりますけど。
VCでは_stat64(あるいは_stati64)を使うと64ビット長でファイルサイズを取得でき、4GB越えにも対応します。
VCでは_stat64(あるいは_stati64)を使うと64ビット長でファイルサイズを取得でき、4GB越えにも対応します。
Re: 2GBを超えるファイルのサイズ取得について
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で殴ればいい!(死亡フラグ)
Re: 2GBを超えるファイルのサイズ取得について
せっかくなのでVCとgccの両方で使えるコードを書いてみました。
【追記】
Ubuntuで64ビット版のとき書式指定(%llu)と実引数の型(long(64ビット))で食い違いになりました。
#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ビット))で食い違いになりました。