【发布时间】:2011-05-25 00:44:35
【问题描述】:
我正在使用 CreateFile api,有时它会随机失败并出现错误:ERROR_SHARING_VIOLATION。
我用谷歌搜索过,几乎没有关于这个错误的信息。奇怪的是下次打开同一个文件还挺开心的。
这是我的代码:
void FileHandle::open(const char* fileName, FILE_MODE mode)
{
if (m_bIsOpen)
close();
HANDLE fh = NULL;
DWORD dwDesiredAccess = GENERIC_READ;
DWORD dwShareMode = FILE_SHARE_READ;
DWORD dwCreationDisposition = OPEN_EXISTING;
switch (mode)
{
case FILE_READ:
break;
case FILE_WRITE:
dwDesiredAccess = GENERIC_WRITE;
dwShareMode = 0;
dwCreationDisposition = CREATE_ALWAYS;
break;
case FILE_APPEND:
dwDesiredAccess = GENERIC_WRITE;
dwShareMode = 0;
dwCreationDisposition = OPEN_ALWAYS;
break;
default:
throw gcException(ERR_INVALID, "The mode was invalid");
break;
}
fh = CreateFile(fileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, 0, NULL);
if (!fh || fh == INVALID_HANDLE_VALUE)
throw gcException(ERR_INVALIDFILE, GetLastError(), gcString("Failed to open the file {0}", fileName));
m_hFileHandle = fh;
m_bIsOpen = true;
if (mode == FILE_APPEND)
{
DWORD high = 0;
DWORD low = GetFileSize(fh, &high);
uint64 pos = (((uint64)high)<<32) + (uint64)low;
seek(pos);
}
}
是我做错了什么还是 api 有问题?
编辑: 我使用完整的文件名(即 C:\somefile.txt)和 mode=FILE_WRITE
【问题讨论】:
-
调用失败时运行哪种情况?此外,您应该只检查文件句柄是否等于 INVALID_HANDLE_VALUE,不要检查它是否为 NULL。另外请在 throw 之前移动 GetLastError 调用并将其存储在 DWORD 中。
-
如果我检查它是否为 NULL 也没关系,错误代码是 32(认为我弄混了,应该是 ERROR_SHARING_VIOLATION)。
-
使用进程监视器 (technet.microsoft.com/en-us/sysinternals/bb896645) 并为您打开的文件的路径设置过滤器。检查是否没有其他进程(例如反恶意软件、桌面搜索、备份)正在打开它。