gpt4 book ai didi

c++ - 要检查 SetFilePointerEx、ReadFile 或 WriteFile 是否成功,我是否需要检查 lpNewFilePointer、lpNumberOfBytesRead 和 lpNumberOfBytesWritten?

转载 作者:行者123 更新时间:2023-11-27 23:52:35 30 4
gpt4 key购买 nike

我对 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,那么您将获得一个简短的读取。对于写入,如果在写入过程中磁盘变满,您可能会得到一个短暂的写入。

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

关于c++ - 要检查 SetFilePointerEx、ReadFile 或 WriteFile 是否成功,我是否需要检查 lpNewFilePointer、lpNumberOfBytesRead 和 lpNumberOfBytesWritten?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45249508/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com