首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不带FILE_FLAG_NO_BUFFERING的SetFilePointer

不带FILE_FLAG_NO_BUFFERING的SetFilePointer
EN

Stack Overflow用户
提问于 2016-05-09 02:41:13
回答 2查看 316关注 0票数 0

考虑这个程序:

代码语言:javascript
复制
#include <stdio.h>
#include <windows.h>
int main(int argc, char** argv) {
  if (argc != 2)
    return 1;
  HANDLE j = CreateFile("\\\\.\\F:", FILE_GENERIC_READ, FILE_SHARE_WRITE,
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
  int k = SetFilePointer(j, atoi(argv[1]), NULL, FILE_BEGIN);
  printf("%d\n", k);
}

我得到了以下结果:

代码语言:javascript
复制
> a 512
512

> a 513
-1

> a 1024
1024

所以我只能以卷扇区大小的倍数来移动文件指针。这是使用FILE_FLAG_NO_BUFFERING标志时应该出现的行为。然而,我没有使用这个标志,那么为什么我会得到这些结果呢?

EN

回答 2

Stack Overflow用户

发布于 2016-05-09 02:49:36

您打开了对驱动器卷而不是文件的直接访问。无论缓冲如何,卷的读/写必须是扇区大小的偶数倍。您不能读/写部分扇区。

票数 3
EN

Stack Overflow用户

发布于 2016-05-09 06:22:46

From the documentation for CreateFile:

卷包含一个或多个挂载的文件系统。即使在CreateFile中未指定非缓存选项,卷句柄也可以根据特定文件系统的需要以非缓存的方式打开。您应该假定所有Microsoft文件系统都将卷句柄作为非缓存打开。对文件的非缓存I/O的限制也适用于卷。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37103491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档