在MinGW 32位上以C为单位确定64位文件大小

时间:2012-09-21 23:44:45

标签: 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; 
}

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

#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 个答案:

答案 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