3

我要疯了,试图让它在 MinGW 32 位中工作。它适用于我尝试过的所有其他平台。

我要做的就是将 > 4GB 文件的大小转换为 64 位整数。

这在其他平台上运行良好:

#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 位文件大小的正确方法是什么?

谢谢!

4

4 回答 4

4

谢谢大家,很好的建议,但我想通了...... MinGW 需要这个定义来启用结构 __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; 
}

希望这可以帮助某人。

于 2012-09-24T15:35:16.330 回答
3

我现在没有方便的 MinGW,但如果我没记错的话,有一个_stat64函数使用struct __stat64. 您可能想用一些狡猾的宏来隐藏这种丑陋!

于 2012-09-22T00:04:53.730 回答
0

您可以尝试lseek64是否存在于 MinGW 包中

   #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);
于 2012-09-21T23:56:05.213 回答
0

您可以调用 Windows APIGetFileSizeEx来获取打开句柄的文件大小,或GetFileAttributesEx获取文件名的 A/W。

有关工作示例,请参见https://stackoverflow.com/a/8991228/1505939

于 2021-02-17T04:12:04.080 回答