错误6句柄在Windows上写入文件无效[关闭]

Posted

技术标签:

【中文标题】错误6句柄在Windows上写入文件无效[关闭]【英文标题】:error 6 the handle is invalid writing to file on Windows [closed] 【发布时间】:2015-01-27 21:00:56 【问题描述】:

Windows (2008 R2) 上的 Visual C++ 6(非 .NET)程序在尝试写入文件时返回“错误代码:6,错误详细信息:句柄无效”。该文件已创建,但由于错误而为空白。

运行程序的 Windows 用户帐户是计算机上的管理员。根据用户的说法,错误“刚刚开始发生”。

同样,文件已创建并且似乎具有正确的权限和所有权。文件用 fopen 打开并用 fwrite 写入。

为什么会发生错误? 它与组策略有关吗? 我从哪里开始看?


[2015-01-28 更新]

返回错误的代码:

m_stream = fopen(m_sLogFile, m_sMode);

if ( m_stream == NULL )

    dwErrorCode = ::GetLastError();
    if (dwErrorCode != ERROR_ALREADY_EXISTS &&
        dwErrorCode != ERROR_SUCCESS)
    
        CaptureError(this->FormatErrorCode (dwErrorCode));
        return FALSE;
    

这是在文件创建之后...

hFile = CreateFile((LPCTSTR) sPathName,                                     // file name
    GENERIC_ALL,                                    // access mode
    FILE_SHARE_READ | FILE_SHARE_WRITE,             // share mode
    NULL,                                               // SD
    CREATE_ALWAYS,                              // how to create                        
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | 
    FILE_FLAG_SEQUENTIAL_SCAN,                          // file attributes
    NULL);                                              // handle to template file

【问题讨论】:

我的水晶球说你的错误处理代码坏了。 Fwrite() 不会生成 Windows 错误代码,它会生成 errno 请显示失败的实际代码。 在尝试fopen之前,是否关闭从CreateFile返回的句柄? 为什么还要混合 Windows API 调用和 CRT 调用?这不会有好的结局。通常,您无法使用fopen 可靠地指定与您在调用CreateFile 时指定的共享权限兼容的共享模式。也不清楚您是否在fopen 之前调用CloseHandle。无论哪种方式,您都不能期望该文件在CloseHandle 返回后立即可用。 我的问题被否决了,因为代码有问题/不好......不是我对社区的期望。感谢那些回答的人,谢谢。 【参考方案1】:

您误用了GetLastError。您只能使用它来获取失败的 Windows API 函数的错误代码(并且只能用于那些记录了 GetLastError 的 API 函数可用于获取错误代码)。您不能可靠地使用它来获取有关失败的 C 标准库函数的更多信息。相反,您需要使用 C 标准定义的接口,即 Hans Passant 在他的评论中提到的 errno 变量。

之所以不能在这里使用GetLastError,是因为一个C 库函数可能需要调用几个Windows API 函数才能实现该函数。不能保证最后调用的 API 会在整个操作的上下文中生成有意义的错误代码。也有可能没有 API 被调用,例如,如果您超过了 C 运行时实现支持的打开文件的数量。

【讨论】:

以上是关于错误6句柄在Windows上写入文件无效[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python Asyncio 错误:“OSError:[WinError 6] 句柄无效”和“RuntimeError:事件循环已关闭”[重复]

如何修复“[错误 6] 句柄无效。”使用 PySerial

pyomo + reticulate 错误6句柄无效

关闭 websocket 时出现 SignalR 错误 - 句柄无效

WINDOWS 系统错误代码

WINDOWS 系统错误代码