我对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
吗?
无论如何,如果有人能澄清,我会很感激。
答案 0 :(得分:3)
对于SetFilePointerEx
,您应该只检查它的返回值。它包含操作是否成功。
对于同步ReadFile
/ WriteFile
,如果返回false,则操作完全失败(根本不读取/写入字节)。如果返回true,则应检查lpNumberOfBytesRead
/ lpNumberOfBytesWritten
,因为它可能低于您指定的数字。例如,对于读取,如果达到EOF,那么您将得到一个简短的读数。对于写入,如果在写入期间磁盘变满,则可能会写一个简短的写入。
短读/写可能有其他各种原因,因此您的代码应该处理这些情况。