Ich verwende die CreateFile-API und manchmal scheitert es zufällig mit dem Fehler: ERROR_SHARING_VIOLATION.
Ich habe gegoogelt und es gibt fast nichts über diesen Fehler. Das Seltsame ist, dass es beim nächsten Mal ganz glücklich ist, die gleiche Datei zu öffnen.
Hier ist mein Code:
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, "Der Modus war ungültig");
break;
}
fh = CreateFile(fileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, 0, NULL);
if (!fh || fh == INVALID_HANDLE_VALUE)
throw gcException(ERR_INVALIDFILE, GetLastError(), gcString("Fehler beim Öffnen der Datei {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);
}
}
Mache ich etwas falsch oder gibt es ein Problem mit der API?
Bearbeiten: Ich verwende den vollständigen Dateinamen (z.B. C:\somefile.txt) und mode=FILE_WRITE