要检查SetFilePointerEx,ReadFile或WriteFile是否成功,我需要检查lpNewFilePointer,lpNumberOfBytesRead和lpNumberOfBytesWritten吗?

时间:2017-07-22 00:42:05

标签: c++ winapi

我对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吗?

无论如何,如果有人能澄清,我会很感激。

1 个答案:

答案 0 :(得分:3)

对于SetFilePointerEx,您应该只检查它的返回值。它包含操作是否成功。

对于同步ReadFile / WriteFile,如果返回false,则操作完全失败(根本不读取/写入字节)。如果返回true,则应检查lpNumberOfBytesRead / lpNumberOfBytesWritten,因为它可能低于您指定的数字。例如,对于读取,如果达到EOF,那么您将得到一个简短的读数。对于写入,如果在写入期间磁盘变满,则可能会写一个简短的写入。

短读/写可能有其他各种原因,因此您的代码应该处理这些情况。