错误 6 句柄在 Windows 上写入文件无效
error 6 the handle is invalid writing to file on Windows
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
您在滥用 GetLastError
。您只能使用它来获取失败的 Windows API 函数的错误代码(并且仅适用于那些记录了 GetLastError
可用于获取错误代码)。您不能可靠地使用它来获取有关失败的 C 标准库函数的更多信息。相反,您需要使用 C 标准定义的接口,Hans Passant 在他的评论中提到的 errno
变量。
这里不能使用GetLastError
的原因是因为一个C库函数可能需要进行多次WindowsAPI函数调用才能实现功能。无法保证最后调用的 API 会在整体操作的上下文中生成有意义的错误代码。也有可能没有 API 被调用,例如,如果您超过了 C 运行时实现支持的打开文件数。
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
您在滥用 GetLastError
。您只能使用它来获取失败的 Windows API 函数的错误代码(并且仅适用于那些记录了 GetLastError
可用于获取错误代码)。您不能可靠地使用它来获取有关失败的 C 标准库函数的更多信息。相反,您需要使用 C 标准定义的接口,Hans Passant 在他的评论中提到的 errno
变量。
这里不能使用GetLastError
的原因是因为一个C库函数可能需要进行多次WindowsAPI函数调用才能实现功能。无法保证最后调用的 API 会在整体操作的上下文中生成有意义的错误代码。也有可能没有 API 被调用,例如,如果您超过了 C 运行时实现支持的打开文件数。