繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM