【发布时间】:2017-07-22 00:42:04
【问题描述】:
我对 SetFilePointerEx、ReadFile 和 WriteFile API 感到有些困惑。比如说,如果我想将文件指针移动到一个新位置,这样做是否足够:
if(SetFilePointerEx(hFile, liPtr, NULL, FILE_BEGIN))
{
//Success, moved file pointer to liPtr position
}
或者,我是否也需要检查lpNewFilePointer 中返回的值?
LARGE_INTEGER liSetTo = {0};
if(SetFilePointerEx(hFile, liPtr, &liSetTo, FILE_BEGIN) &&
liPtr.QuadPart == liSetTo.QuadPart)
{
//Success
}
这同样适用于 ReadFile 和 WriteFile。例如:
if(WriteFile(hFile, buffer, numberBytesToWrite, NULL, NULL))
{
//Success writing numberBytesToWrite into file
}
或者我需要这样做以确保我的所有数据都写入成功:
DWORD numberBytesWritten = 0;
if(WriteFile(hFile, buffer, numberBytesToWrite, &numberBytesWritten, NULL) &&
numberBytesWritten == numberBytesToWrite)
{
//Success writing numberBytesToWrite into file
}
换句话说,拥有这些返回大小和偏移量有什么意义?我的意思是,如果我想让它把 1024 个字节写入一个文件,它可以只写 1000 个字节。 :) 如果它没有写入我请求它的所有数据,那会不会构成错误,或者从 API 返回FALSE?
无论如何,如果有人能澄清一下,我将不胜感激。
【问题讨论】:
-
setpointer 从文件开头返回新位置。至于读/写,是的,它们可以返回成功,但读/写你指定的字节数更少。
-
@geza:在我的示例中,
WriteFile在什么情况下会返回TRUE和numberBytesToWrite!=numberBytesWritten? -
一个实例,当磁盘已满(或达到用户的存储配额)时,WriteFile 不会写入请求的数量。到达文件末尾时,ReadFile 将读取更少。
-
一个例子是来自命名管道的 ReadFile 将在相应的写操作结束时返回。因此,如果您要求 10 个字节,但管道另一端的进程只发送 5 个,那么您只会得到 5 个。此外,非阻塞套接字可能读取和/或写入的字节数少于请求的字节数。我不认为写入普通文件会写入比请求更少的字节数。
-
@RbMm:Zw*/Nt* 函数不是 Windows API 的一部分。没有关于可用性的明确合同公布。它们可以在未来的版本中被删除(不太可能),应用额外的限制(例如,只能从签名的二进制文件中调用),或者被安全软件阻止,除非从受信任的系统模块调用。