![](/img/trans.png)
[英]ReadFile() returning 1 with “lpNumberOfBytesRead” set to 0
[英]To check SetFilePointerEx, ReadFile or WriteFile for success do I need to check lpNewFilePointer, lpNumberOfBytesRead and lpNumberOfBytesWritten?
我对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
?
无论如何,如果有人可以澄清,我将不胜感激。
对于SetFilePointerEx
,您应该只检查它的返回值。 它包含操作是否为成功。
对于同步的ReadFile
/ WriteFile
,如果返回false,则操作完全失败(根本没有读取/写入字节)。 如果返回true,则应检查lpNumberOfBytesRead
/ lpNumberOfBytesWritten
,因为它可以低于您指定的数字。 例如,对于阅读,如果达到EOF,您将获得简短阅读。 对于写操作,如果在写操作期间磁盘已满,则可能会进行短暂的写操作。
短读/写可能还有其他各种原因,因此您的代码应处理这些情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.