PRB: ERROR_SHARING_VIOLATION Fehlermeldung schlägt die CreateFile-Funktion

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 316609 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Problembeschreibung

Wenn Sie eine Datei mit der FILE_SHARE_READ-Flag und das FILE_SHARE_WRITE-Flag öffnen, kann die CreateFile -Funktion fehlschlagen und folgenden Fehlermeldung zurückzugeben:
ERROR_SHARING_VIOLATION (Fehlercode 32)

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Wenn Sie eine Datei öffnen mithilfe der CreateFile -Funktion oder einer Funktion, die intern CreateFile verwendet, können einen unerwarteten Fehler wegen einer Zugriffsverletzung auftreten. Auch wenn die Datei nur für eine bestimmte Anwendung ist, sind möglicherweise andere Prozesse, die auf die Datei gleichzeitig zugreifen können. Es gibt allgemeine Systemkomponenten und auch andere Anwendungen von Drittanbietern, die dieses Problem verursachen. Sind allgemeine Systemkomponenten und auch Anwendungen von Drittanbietern (z. B. Antivirus-Software), die dieses Problem verursachen.

Microsoft Windows-Betriebssystem ist ein präemptiven, Multiprocessing-System, die die Darstellung des viele Anwendungen gleichzeitig ausgeführt. Jede bestimmte Anwendung muss "kompatibel", dass Sie nicht der einzige Prozess auf dem System ausgeführt ist und dass es für Ressourcen mit anderen Prozessen wetteifern ist sein. Probleme, die aufgrund der Behandlung von Ressourcen auftreten können, müssen behandelt werden. Im Fall von Dateien hat jeden laufenden Prozess die Berechtigung zu versuchen, die Ressource verwenden. Es gibt immer Systemkomponenten und Dienste von Drittanbietern, die gleichzeitig für Ressourcen konkurrieren. Wenn versucht eine Anwendung auf Dateien auf dem System zuzugreifen, die Anwendung mit anderen Prozessen u. u..

Es sind zwei häufige Ursachen für einen ERROR_SHARING_VIOLATION:
  • Es gibt mehrere Anwendungen, die eine bestimmte Datei auf Datenträger (häufig freigegebenen Datendateien) verwenden. Eine Anwendung greift derzeit die Datei in eine Möglichkeit, die nicht kompatibel mit der Art und Weise ist eine zweite Anwendung versucht, auf dieselbe Datei zugreifen. Beispielsweise können Sie die Datei zu aktualisieren, aber einem anderen Prozess derzeit Schreiben der Datei und Freigabe ist nur der Datei zum Lesen (FILE_SHARE_READ).
  • Die Datei ist spezifisch für Ihre Anwendung eine Datendatei, und Sie erwarten keine eine andere Anwendung die Datei geöffnet haben. In diesem Szenario möglicherweise andere Prozesse eine Datei für eine kurze Dauer anderen Gründen zu sperren.
Das häufigste Problem tritt, wenn ein Dienstprogramm, wie z. B. ein Virenscanner, Sicherungssoftware oder eine Datenträger-Optimierer, die eine Datei auf Datenträger für kurze Zeit sperrt. Wenn eine andere Anwendung versucht, die Datei zu öffnen, selbst mit vollständigen Freigabe aktiviert, schlägt der Versuch mit einer Zugriffsverletzung fehl. Sie können dieses Ergebnis erwarten, da der Dienst exklusiv für die Dauer des Vorgangs auf die Datei aufweisen muss. Um dieses Problem zu beheben, versuchen Sie erneut eine kurze Zeit später. Der Dienst wird häufig mit der Datei in Sekundenschnelle Millisekunden abgeschlossen.

Beide die Ursachen für Freigabeverletzungen beschriebenen müssen entsprechend behandelt werden. Wenn Sie eine Datei öffnen, müssen Sie eine Zugriffsverletzung so, dass Sie nicht den Benutzer des Systems auswirken oder bewirken, das System Absturz dass immer sicheres Weise behandeln. Sie können dazu einen einfachen Wiederholungsmechanismus. Sie müssen möglicherweise mehrere Wiederholungen ausführen, bevor die Datei nicht gesperrt ist.

Das folgende Codebeispiel veranschaulicht dieses Verfahren:
#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 zur Behandlung von des Freigabe Verletzung Fehlers ordnungsgemäß bietet eine Anwendung, die die Datei Zeit geöffnet. Jedes Mal, dass eine Freigabe Zugriffsverletzung-Fehlermeldung angezeigt müssen Sie die Anwendung den Ruhezustand für eine Weile zulassen und versuchen Sie es dann erneut. Wenn ein Virenscanner oder ein Systemdienst hat möglicherweise die Datei öffnen, der Virenscanner oder der Systemdienst nach einem oder zwei Wiederholungen beendet. Stellen Sie sicher, dass Ihre Wiederholungen zu vermeiden, eine Endlosschleife beschränkt. Wenn eine andere Anwendung derzeit hat die Datei geöffnet (und möglicherweise die Datei für einen langen Zeitraum geöffnetem) informieren des Benutzers von außerhalb der Schleife unterbrechen und dann ordnungsgemäß beendet.

Eigenschaften

Artikel-ID: 316609 - Geändert am: Dienstag, 21. November 2006 - Version: 1.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Win32 Application Programming Interface
Keywords: 
kbmt kbfileio kbkernbase kbprb KB316609 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 316609
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com