我试图让这个在MinGW 32位工作时疯了。它适用于我尝试的所有其他平台。
我想做的就是获得>的大小将4GB文件转换为64位int。
这在其他平台上运行良好:
#define _FILE_OFFSET_BITS 64
#include <sys/stat.h>
int64_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
我尝试在上面的代码之前添加以下定义,基于我在网上找到的各种建议:
#define _LARGEFILE_SOURCE 1
#define _LARGEFILE64_SOURCE 1
#define __USE_LARGEFILE64 1
也尝试过:
#ifdef __MINGW32__
#define off_t off64_t
#endif
最后尝试将-D_FILE_OFFSET_BITS = 64添加到gcc标志(应该与上面的定义相同但是......)
没有运气。返回的int64_t仍然被截断为32位值。
在MinGW 32位中确定64位文件大小的正确方法是什么?
谢谢!
答案 0 :(得分:3)
我现在没有MinGW方便,但如果我没记错,有_stat64
函数使用struct __stat64
。你可能想用一些狡猾的宏隐藏这种丑陋!
答案 1 :(得分:2)
谢谢大家,很好的建议,但我想出来...... MinGW需要这个定义来启用struct __stat64和函数_stat64:
#if __MINGW32__
#define __MSVCRT_VERSION__ 0x0601
#endif
然后这个有效:
int64_t fsize(const char *filename) {
#if __MINGW32__
struct __stat64 st;
if (_stat64(filename, &st) == 0)
#else
struct stat st;
if (stat(filename, &st) == 0)
#endif
return st.st_size;
return -1;
}
希望这有助于某人。
答案 2 :(得分:0)
如果MinGW包中存在lseek64
,您可以尝试 #define _LARGEFILE64_SOURCE /* See feature_test_macros(7) */
#include <sys/types.h>
#include <unistd.h>
off64_t lseek64(int fd, off64_t offset, int whence);
{{1}}
答案 3 :(得分:0)
您可以调用 Windows API GetFileSizeEx
获取打开句柄的文件大小,或调用 GetFileAttributesEx
A/W 获取文件名。
有关工作示例,请参阅 https://stackoverflow.com/a/8991228/1505939。