PRB: Foutbericht ERROR_SHARING_VIOLATION wanneer de functie CreateFile mislukt

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 316609 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Symptomen

Wanneer u een bestand met de aanvrager FILE_SHARE_READ vlag en de vlag FILE_SHARE_WRITE opent, deCreateFilefunctie kan mislukken en het volgende fout bericht weer gegeven:
ERROR_SHARING_VIOLATION (foutcode 32)

Status

Dit gedrag is inherent aan het ontwerp.

Meer informatie

Wanneer u een bestand opent met behulp van deCreateFilefunctie of elke functie die wordt gebruiktCreateFileintern, treedt een onverwachte fout vanwege schending van delen. Zelfs als het bestand slechts voor een bepaalde toepassing is, zijn er mogelijk andere processen die proberen toegang te krijgen tot het bestand op hetzelfde moment. Er zijn algemene systeemonderdelen en ook andere toepassingen van andere leveranciers die dit probleem veroorzaken. Er zijn algemene systeemonderdelen en toepassingen van andere leveranciers (zoals virus controle software) die dit probleem veroorzaken.

Het besturingssysteem Microsoft Windows is een voorrang, SMP systeem, waarmee het uiterlijk van veel toepassingen tegelijk worden uitgevoerd. Een bepaalde toepassing moet "bewust" het is niet het enige proces uitgevoerd op het systeem en het is vying voor resources met andere processen. Problemen die als gevolg van de verwerking van bron optreden kunnen moeten worden aangepakt. In het geval van bestanden heeft elk proces dat wordt uitgevoerd het recht om te proberen om de bron te gebruiken. Er zijn altijd systeemonderdelen en services van derden die voor resources tegelijkertijd concurreren. Als een toepassing probeert toegang te krijgen tot bestanden op het systeem die toepassing met andere processen concurreert.

Er zijn twee oorzaken voor een ERROR_SHARING_VIOLATION:
  • Er zijn meerdere toepassingen die gebruikmaken van een bepaald bestand op schijf (gemeenschappelijke gedeelde gegevensbestanden). Een toepassing is momenteel toegang hebben tot het bestand op een manier die niet compatibel is met de manier waarop die een tweede toepassing probeert toegang te krijgen tot hetzelfde bestand. Zo kunt u het bestand wilt bijwerken, maar een ander proces is momenteel schrijven naar het bestand en is alleen het delen van het bestand voor het lezen van de (aanvrager FILE_SHARE_READ).
  • Het bestand is een gegevensbestand voor uw toepassing en u niet verwacht dat een andere toepassing naar het bestand hebt geopend. In dit scenario, kunnen andere processen een bestand vergrendelen voor een korte duur om andere redenen.
Het meest voorkomende probleem treedt op wanneer een programma, zoals een virus scanner, backup-software of een schijf optimalisatie, dat een bestand op schijf voor korte tijd blokkeert. Wanneer een andere toepassing probeert het bestand te openen, zelfs met volledige delen is ingeschakeld, mislukt de poging met een deelfout. Omdat de service exclusief toegang voor de duur van de bewerking op het bestand hebben moet, kunt u dit resultaat verwachten. Dit probleem wilt oplossen, probeer een korte tijd later. De service wordt vaak aangevuld met het bestand in een kwestie van milliseconden.

Zowel de oorzaken voor het delen van schendingen van het eerder beschreven moeten op dezelfde manier worden behandeld. Wanneer u een bestand opent, moet u altijd een deelfout op correcte wijze verwerkt zodat u geen invloed op de gebruiker van het systeem of het systeem vastloopt. U kunt dit doen met behulp van een eenvoudig opnieuw mechanisme. U moet meerdere pogingen tot opstarten uitvoeren voordat het bestand ontgrendeld wordt.

De volgende voorbeeld code wordt deze techniek gedemonstreerd:
#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.
}
				
Deze methode voor het verwerken van probleemloos delen fout krijgt een toepassing die het bestand heeft geopend om uit te voeren. Elke keer dat u een fout delen ontvangt, moet u de toepassing toestaanslaaps tandvoor een tijdje en probeer het opnieuw. Als een virus scanner of een systeemservice heeft kan het bestand wordt geopend, de virus scanner of de systeemservice eindigen na een of twee pogingen. Zorg ervoor dat u uw pogingen beperken om te voorkomen dat een oneindige lus. Als een andere toepassing die momenteel het bestand is geopend (en het bestand geopend voor een lange tijd houden kan), de gebruiker informeren door te breken uit de lus en probleemloos sluit.

Eigenschappen

Artikel ID: 316609 - Laatste beoordeling: maandag 28 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Win32-API
Trefwoorden: 
kbfileio kbkernbase kbprb kbmt KB316609 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:316609
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.

Geef ons feedback

 

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