You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32代码迁移至macOS:_filelengthi64函数替代方案咨询

解决Win32到macOS移植中的文件长度获取问题

我帮你搞定这个移植的卡点——Windows的_filelengthi64确实是平台特有的函数,在macOS(属于POSIX系统)上我们需要用标准的POSIX API来替换它,同时调整相关的辅助函数。

核心替换方案

  • 替换_fileno:macOS上直接用标准POSIX函数fileno()即可,它和Windows的_fileno功能完全一致,都是从FILE*获取对应的文件描述符,只需要去掉下划线。
  • 替换_filelengthi64:用fstat64函数来获取已打开文件的64位长度,这是POSIX系统获取文件属性的标准方式。

修改后的完整代码片段

main_int64 pos;
OP_ASSERT(sizeof(pos)==sizeof(fpos_t));

/*Translate the seek to an absolute one.*/
if(_whence==SEEK_CUR) {
    int ret;
    ret=fgetpos((FILE *)_stream,(fpos_t *)&pos);
    if(ret) return ret;
} else if(_whence==SEEK_END) {
    // 替换Windows的_filelengthi64逻辑
    int fd = fileno((FILE *)_stream);
    if (fd == -1) {
        return -1;
    }
    struct stat64 st;
    if (fstat64(fd, &st) == -1) {
        return -1;
    }
    pos = (main_int64)st.st_size;
} else if(_whence==SEEK_SET) {
    pos=0;
} else {
    return -1;
}

/*Check for errors or overflow.*/
if(pos<0||_offset<-pos||_offset>OP_INT64_MAX-pos) {
    return -1;
}
pos+=_offset;

int seeko = fsetpos((FILE *)_stream,(fpos_t *)&pos);
fprintf("BaseTool", "SEEKO VALUE %d \n", seeko);
return seeko;

关键细节说明

  • 头文件依赖:需要在代码顶部添加必要的POSIX头文件:
    #include <sys/stat.h>   // 用于fstat64和stat64结构体
    #include <unistd.h>     // 部分环境下fileno需要这个头文件
    #include <stdint.h>     // 如果使用INT64_MAX替代OP_INT64_MAX的话
    
  • 类型兼容:st.st_size的类型是off_t,在macOS上默认是64位的,强制转换为main_int64是安全的,只要main_int64是64位整数类型(比如int64_t)。
  • 错误处理:新增了对fileno和fstat64的错误检查,和Windows平台上_filelengthi64失败返回-1的行为保持一致,保证代码的健壮性。

额外提示

如果你的代码中OP_INT64_MAX是Windows特有的定义,可以替换为标准的INT64_MAX(来自<stdint.h>),确保在macOS上能正确获取64位整数的最大值。

内容的提问来源于stack exchange,提问作者Muhammad Umar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 08:52:57