考虑这个程序:
#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所期望的行为 旗。但是我没有使用那个标志,为什么我得到这些结果呢?
答案 0 :(得分:3)
您打开直接访问驱动器卷而不是文件。无论缓冲如何,卷的读/写必须是扇区大小的偶数倍。你不能读/写部分扇区。
答案 1 :(得分:1)
From the documentation for CreateFile:
卷包含一个或多个已安装的文件系统。即使在CreateFile中未指定非高速缓存选项,也可以根据特定文件系统的判断将卷句柄打开为非高速缓存。您应该假设所有Microsoft文件系统都将未处理的卷句柄打开。对文件的非高速缓存I / O的限制也适用于卷。