在 MinGW 32 位上确定 C 中的 64 位文件大小

Jet*_*ack 3 c mingw filesize

我正在疯狂地尝试让它在 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; 
}
Run Code Online (Sandbox Code Playgroud)

根据我在网上找到的各种建议,我尝试在上述代码之前添加以下定义:

#define _LARGEFILE_SOURCE   1
#define _LARGEFILE64_SOURCE 1
#define __USE_LARGEFILE64   1
Run Code Online (Sandbox Code Playgroud)

还尝试过:

#ifdef __MINGW32__
#define off_t off64_t
#endif
Run Code Online (Sandbox Code Playgroud)

最后尝试将 -D_FILE_OFFSET_BITS=64 添加到 gcc 标志(应该与上面的定义相同......)

没有运气。返回的 int64_t 仍然被截断为 32 位值。

在 MinGW 32 位中确定 64 位文件大小的正确方法是什么?

谢谢!

Jet*_*ack 5

谢谢大家,很好的建议,但我想通了...... MinGW 需要这个定义来启用 struct __stat64 和函数 _stat64:

#if __MINGW32__
#define __MSVCRT_VERSION__ 0x0601
#endif
Run Code Online (Sandbox Code Playgroud)

然后这有效:

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; 
}
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助。