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
相关产品推荐
相关产品推荐

