没有FILE_FLAG_NO_BUFFERING的SetFilePointer

时间:2016-05-08 18:41:13

标签: c windows winapi createfile

考虑这个程序:

#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);
}

我得到了这些结果:

> a 512
512

> a 513
-1

> a 1024
1024

所以我只能将文件指针移动到卷扇区大小的倍数。这个 是FILE_FLAG_NO_BUFFERING所期望的行为 旗。但是我没有使用那个标志,为什么我得到这些结果呢?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

From the documentation for CreateFile:

  

卷包含一个或多个已安装的文件系统。即使在CreateFile中未指定非高速缓存选项,也可以根据特定文件系统的判断将卷句柄打开为非高速缓存。您应该假设所有Microsoft文件系统都将未处理的卷句柄打开。对文件的非高速缓存I / O的限制也适用于卷。