6 Stimmen

CreateFile schlägt mit dem Fehler ERROR_SHARING_VIOLATION fehl

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

7voto

shf301 Punkte 30610

Es ist nichts falsch an CreateFile - ein Sharing-Verstoß bedeutet, dass etwas anderes dieselbe Datei geöffnet hat. Dies könnte auch Ihr eigenes Programm sein, wenn Sie die Datei mit einem Freigabemodus von 0 geöffnet haben, können Sie sie nicht erneut öffnen.

Wenn Sie den Fehler erhalten, können Sie Process Explorer verwenden, um festzustellen, welche Prozesse die Datei geöffnet haben.

1voto

Michael Burr Punkte 320591

Gibt es Antivirus auf dem Computer? Manchmal können die Operationen und Zeitsteuerung eines AV's (oder anderer Software, die Dateien überwacht) zu Konflikten beim Teilen führen.

Dies trifft besonders dann zu, wenn Sie eine vorhandene Datei für den exklusiven Zugriff öffnen (dies wäre der Fall für die Fälle FILE_WRITE und FILE_APPEND, wenn die Datei bereits existiert).

1voto

wallyk Punkte 55322

Ich meine keinen Respekt, aber letzte Woche habe ich mir selbst ins Bein geschossen bei etwas Ähnlichem:

Bist du sicher, dass nichts anderes die Datei geöffnet hat, was den Zugriff verhindern könnte?

In meinem Fall hatte ich in einem Linux-Befehlsfenster Strg-Z verwendet, um ein Programm zu unterbrechen, das eine Socket-Verbindung erstellt hatte, dann ging ich ins Bett. Am nächsten Morgen, nach ein paar einfachen Änderungen, bekam ich immer wieder die Meldung "Socket kann nicht erstellt werden: Dienst in Benutzung", wenn ich das Programm ausführte. Leider habe ich Stunden damit verbracht, zu debuggen, was ich kaputt gemacht hatte. Sobald ich den betroffenen unterbrochenen Prozess beendet hatte, funktionierte es einwandfrei.

0voto

mrdiskodave Punkte 335

Microsoft sagt hier, dass dies passieren kann und es an der Anwendung liegt, es erneut zu versuchen, wenn dies der Fall ist. Schrecklich, aber so ist es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X