以下代码有两个问题。首先,我一直在这个论坛和其他论坛上搜寻我的1784错误代码的答案,而我尝试过的一切都失败了。我在stackoverflow上检查的两个线程是WriteFile returning error 1784BlockWrite I/O Error 1784。我在这个论坛上检查了其他人,但是我不记得现在到底是什么。

我正在尝试将结构数组保存到一个空的二进制文件中。第一个问题是,如果我的大小变量(nNumberOfBytesToWrite参数)小于99000字节,则会出现访问冲突。这个数字跳来跳去。有一段时间,当我进行测试时,如果它是99,999字节而不是100,000字节,则会出现访问冲突。当然,我最终要做的是将大小设置为整个数组的大小。现在已注释掉要处理的原始代码,因此我可以使用各种大小进行测试。

发生的第二件事(如果没有访问冲突)是我收到错误代码1784,并且WriteFile每次都失败。正如该主题上的其他线程所述,在MSDN上将其定义为ERROR_INVALID_USER_BUFFER,并且描述为“提供的用户缓冲区对于请求的操作无效。”我看过MSDN自己的示例来打开这样的文件(http://msdn.microsoft.com/en-us/library/windows/desktop/bb540534%28v=vs.85%29.aspx),并尝试根据其代码进行一些变体,但是似乎没有任何效果。

这个问题可能在很大程度上是菜鸟,我敢肯定我忽略了一个荒谬的简单事情,但是如果有人提出建议,将不胜感激。

case IDM_SAVE1:
{
    HANDLE hFile = CreateFile("MineSave.mss", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    int test_buffer[] = {1,2,3,4,5,6,7,8,9,10};

    if(hFile != INVALID_HANDLE_VALUE)
    {
        BOOL bSuccess;
        DWORD size = 100000; //DWORD size = (((sizeof(tile)) * tiles_total));
        LPDWORD bytes_written = 0;
        bSuccess = WriteFile(hFile, test_buffer, size, bytes_written, NULL);
        if(bSuccess)
        {
            MessageBox(hwnd, "File saved successfully.", "Great Job!", MB_OK);
        }
        else
        {
            DWORD error = GetLastError();
            MessageBox(hwnd, "Could not write to file.", "Error", MB_OK);
        }

        CloseHandle(hFile);
    }
    else
    {
        MessageBox(hwnd, "Could not create file.", "Error", MB_OK);
    }
}
break;

最佳答案

缓冲区的大小为10 ints,在Windows上为40字节。您试图从该缓冲区写入100,000个字节。那是不确定的行为,缓冲区溢出。因此,访问冲突。

您不得将大于sizeof(test_buffer)的值(即40)传递给nNumberOfBytesToWriteWriteFile参数。

您需要循环写入此文件,一次写入40个字节,直到写入所需的数量为止。也许是这样的:

BOOL bSuccess = TRUE;
DWORD bytesRemaining = 100000;
while (bSuccess && bytesRemaining>0)
{
    DWORD bytesToWrite = std::min(sizeof(test_buffer), bytesRemaining);
    DWORD bytesWritten;
    bSuccess = WriteFile(hFile, test_buffer, bytesToWrite, &bytesWritten, NULL);
    bytesRemaining -= bytesToWrite;
}
if (!bSuccess)
{
    //handle error;
}

一次写入40个字节非常慢。您会发现,每次调用WriteFile时写几个KB效率更高。

请注意,如果您也将NULL传递给lpNumberOfBytesWritten,则不允许将NULL传递给lpOverlapped参数,如此处所示。从documentation:

关于c++ - Win32 Writefile:访问冲突和错误1784,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12643441/

10-12 14:47