为何只读空文件调用SetFilePointerEx设置偏移100会成功?该函数何时会失败?
关于SetFilePointerEx的行为疑问
问题详情
针对以只读方式打开的空文件,调用SetFilePointerEx设置基于文件开头的绝对偏移量为100时,代码返回成功且pos变量被赋值为100,这与直觉不符(已知可写文件的此类行为是正常的)。相关代码如下:
LARGE_INTEGER offset; offset.QuadPart = 100; LARGE_INTEGER pos = {0}; return ::SetFilePointerEx(_h, offset, &pos, FILE_BEGIN) != 0;
注:文件未使用重叠IO,也无任何特殊标志。
同时咨询:对于有效句柄、正绝对偏移量和普通文件,SetFilePointerEx是否会失败?
解答
1. 只读空文件上SetFilePointerEx成功的原因
Windows中的文件指针其实就是记录在文件句柄里的逻辑位置标记,修改它不需要改动文件内容或扩展文件本身——哪怕是只读文件,也允许调整这个标记。只有当你尝试从这个超出文件当前大小的位置读取数据时,才会返回ERROR_HANDLE_EOF失败,但单纯调整指针位置是被允许的。
这是因为文件指针属于句柄的属性,而非文件本身的物理属性,只读权限限制的是对文件内容的修改,而非对句柄自身状态的调整。
2. SetFilePointerEx可能失败的场景
即便拥有有效句柄、设置正绝对偏移量且操作对象是普通文件,以下情况仍会导致SetFilePointerEx失败:
- 偏移量超出了文件系统支持的最大文件大小(比如FAT32单文件最大限制为4GB,设置偏移量超过此值会失败)
- 文件句柄对应的区域被锁定,且偏移量落在锁定范围内(部分场景下)
- 底层存储设备出现异常(比如磁盘损坏、设备离线)
- 若操作的是远程文件,网络连接中断或远程服务器返回错误
内容的提问来源于stack exchange,提问作者Violet Giraffe
相关产品推荐
相关产品推荐

