【问题标题】:Determine 64-bit file size in C on MinGW 32-bit在 MinGW 32 位上确定 C 中的 64 位文件大小
【发布时间】:2012-09-21 23:44:45
【问题描述】:

我正在疯狂地试图让它在 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 位文件大小的正确方法是什么?

谢谢!

【问题讨论】:

    标签: c mingw filesize


    【解决方案1】:

    谢谢大家,很好的建议,但我想通了...... 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; 
    }
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 可能没必要太狡猾 - 只需在 fsize() 函数中添加一个 #if _WIN32/#else/#endif
      • @MichaelBurr 只要fsize() 是他/她使用stat 的唯一地方。 (当我狡猾地打字时,我的舌头牢牢地贴在我的脸颊上!)
      • 这有效,但 _stat64 仅在 MinGW 中可用,如果您在 #include 之前添加它,否则 stat64 符号将无法解析:#define MSVCRT_VERSION 0x0601
      【解决方案3】:

      如果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);
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 2012-10-20
          • 2020-09-16
          • 2014-03-14
          • 1970-01-01
          相关资源
          最近更新 更多