PRB: ERROR_SHARING_VIOLATION Fehlermeldung CreateFile-Funktion fehlschlägt

Veralteter Haftungsausschluss für KB-Inhalte

Dieser Artikel wurde für Produkte geschrieben, für die Microsoft keinen Support mehr anbietet. Deshalb wird dieser Artikel im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.

Problembeschreibung

Beim Öffnen einer Datei mit dem FILE_SHARE_READ-Flag und das Flag FILE_SHARE_WRITE kann die Funktion CreateFile fehl und die folgende Fehlermeldung:
ERROR_SHARING_VIOLATION (Fehlercode 32)

Status

Dieses Verhalten ist entwurfsbedingt.

Weitere Informationen

Beim Öffnen einer Datei die Funktion CreateFile oder eine Funktion, die intern CreateFile verwendet auftreten einen unerwarteten Fehler durch gemeinsamen. Auch wenn die Datei nur für eine bestimmte Anwendung, sind möglicherweise andere Prozesse, die versuchen, gleichzeitig auf die Datei zugreifen. Es sind gemeinsame Komponenten und andere Fremdanbieter-Programme, die dieses Problem verursachen. Gibt allgemeine Systemkomponenten und Drittanbietern (wie Antivirus-Software), die dieses Problem verursachen.

Microsoft Windows-Betriebssystems ist eine präventive, Multiprocessing System Erscheinungsbild viele Programme gleichzeitig ausgeführt. Eine bestimmte Anwendung muss "" ist nicht der einzige Prozess auf dem System ausgeführt und wetteifern für Ressourcen mit anderen Prozessen berücksichtigen. Probleme aufgrund Ressourcenbehandlung müssen behandelt werden. Bei Dateien berechtigt jeden laufenden Prozess zu versuchen, die Ressource. Gibt immer Komponenten und Dienste von Drittanbietern, die gleichzeitig Ressourcen konkurrieren. Wenn eine Anwendung versucht, Dateien auf das System zugreifen, die Anwendung mit anderen Prozessen konkurrieren.

Es gibt zwei häufige Ursachen für einen ERROR_SHARING_VIOLATION:
  • Es gibt mehrere Programme, mit denen eine bestimmte Datei auf dem Datenträger (gemeinsamen freigegebenen Datendateien). Eine Anwendung wird die Datei so zugreift, die nicht mit eine zweite Anwendung versucht, auf diese Datei zuzugreifen. Beispielsweise die Datei aktualisieren möchten, aber ein anderer Prozess zurzeit in die Datei geschrieben und wird nur die Freigabe der Datei zum Lesen (FILE_SHARE_READ).
  • Die Datei ist eine anwendungsspezifische Datei, und Sie nicht erwarten, dass eine andere Anwendung die Datei geöffnet haben. In diesem Szenario möglicherweise andere Prozesse eine Datei kurzzeitig aus anderen Gründen zu sperren.
Das häufigste Problem tritt auf, wenn ein Dienstprogramm wie ein Virenscanner, backup-Software oder ein Datenträger-Optimierer, die auf dem Datenträger für kurze Zeit sperrt. Wenn eine andere Anwendung versucht, die Datei öffnen auch mit vollständigen Freigabe aktiviert, schlägt das mit gemeinsamen. Da der Dienst exklusiv für die Dauer des Vorgangs auf die Datei zugreifen muss, erwarten Sie dieses Ergebnis. Um dieses Problem zu beheben, versuchen Sie kurze Zeit später. Häufig wird der Dienst mit der Datei in Millisekunden abgeschlossen.

Sowohl die Ursachen für die Freigabe beschriebenen Verstöße müssen entsprechend behandelt werden. Beim Öffnen einer Datei müssen Sie gemeinsamen immer ein schrittweises behandeln, sodass Sie Benutzer des Systems betreffen oder einen Absturz verursachen. Dazu können Sie einen einfachen Wiederholungsmechanismus verwenden. Möglicherweise mehrere Versuche durchzuführen, bevor die Datei nicht gesperrt ist.

Im folgenden Beispiel wird dieses Verfahren veranschaulicht:

#define MAXRETRIES  5#define RETRYDELAY  250

HANDLE hFile = INVALID_HANDLE_VALUE
DWORD dwRetries = 0;
BOOL bSuccess = FALSE;
DWORD dwErr = 0;

do
{
hFile = CreateFile( szFile,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( INVALID_HANDLE_VALUE == hFile )
{
dwErr = GetLastError();

if ( ERROR_SHARING_VIOLATION == dwErr )
{
dwRetries += 1;
Sleep(RETRYDELAY);
continue;
}
else
{
// An error occurred.
break;
}
}

bSuccess = TRUE;
break;
} while ( dwRetries < MAXRETRIES );

if ( bSuccess )
{
// You succeeded in opening the file.
}
else
{
// Failure occurs. Do graceful error handling.

// Here, you must notify the user of the failure.

MessageBox( NULL,
"Tried to update data file but it was already in use",
"Update error...",
MB_OK | MB_ICONSTOP );

// You also want to put the software back in the state it was in
// on entrance of the current function, as if the user had never
// tried to do the update.

// This may also require deallocating any resources that were
// allocated because of this operation.
}

Diese Methode ordnungsgemäß Fehlerbehandlung Freigabe Verletzung ermöglicht eine Anwendung, die Zeit geöffnet ist. Jedes Mal, wenn eine Freigabe Verletzung erhalten müssen Sie ermöglichen die Anwendung Schlaf für eine Weile und versuchen Sie es erneut. Ein Virenscanner oder ein Systemdienst kann Datei öffnen, Virenscanner oder der Systemdienst nach ein oder zwei Wiederholungen beendet werden. Vergewissern Sie sich, um eine Endlosschleife zu vermeiden Ihre Versuche zu beschränken. Wenn eine andere Anwendung derzeit geöffnet hat und möglicherweise die Datei geöffnet lange lassen informieren Sie den Benutzer von der Schleife ausbrechen und dann beenden.
Eigenschaften

Artikelnummer: 316609 – Letzte Überarbeitung: 21.01.2017 – Revision: 1

Feedback