PRB: ERROR_SHARING_VIOLATION chybová zpráva při selhání funkce CreateFile

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Příznaky

Při otevření souboru s FILE_SHARE_READ příznak a příznak FILE_SHARE_WRITE funkce CreateFile může selhat a vrátit následující chybová zpráva:
ERROR_SHARING_VIOLATION (kód chyby 32)

Stav

Toto chování je záměrné.

Další informace

Při otevření souboru pomocí funkce CreateFile nebo všechny funkce, které používá interně CreateFile může dojít k neočekávanému selhání z důvodu narušení sdílení. I v případě, že soubor je jen pro určitou aplikaci, jsou potenciálně jiné procesy, které se může pokusit o přístup k souboru současně. Existují běžné systémové součásti a také další aplikace jiných výrobců, které tento problém způsobují. Existují běžné systémové součásti a také aplikace jiných výrobců (například antivirový software), tento problém způsobují.

Operační systém Microsoft Windows je preemptivní, systém více procesy vzniká dojem z mnoha aplikací, které jsou spuštěny současně. Každé jednotlivé aplikaci musí být "vědět", že to není pouze proces spuštěný v systému a že je vying pro prostředky s ostatními procesy. Je nutné vyřešit problémy, které může dojít v důsledku zpracování prostředku. V případě souborů jakýkoli spuštěný proces má právo pokusí použít prostředek. Stále existují systémové součásti a služby třetích stran, které soutěží o prostředky současně. Pokud aplikace se pokusí získat přístup k souborům v systému, který aplikaci nesoutěží s ostatními procesy.

Existují dva běžné příčiny ERROR_SHARING_VIOLATION:
  • Existuje více aplikací, které používají určitý soubor na disku (společné soubory sdílených dat). Aplikace je aktuálně přístup k souboru způsobem, který není kompatibilní se způsobem druhé aplikace pokusí o přístup stejný soubor. Například můžete chtít soubor aktualizovat, ale jiný proces je aktuálně zápisu do souboru a je pouze sdílení souboru pro čtení (FILE_SHARE_READ).
  • Soubor je datový soubor, který je specifické pro vaši aplikaci a neočekáváte soubor otevřít jiné aplikace. V tomto scénáři může jiných procesů uzamčení souboru na krátkou dobu z jiných důvodů.
Nejběžnější problém nastane, pokud program pro vyhledávání virů, software pro zálohování nebo optimalizace disku, které uzamkne soubor na disku po krátkou dobu. Když se jiná aplikace pokusí otevřít soubor, i s zapnuto sdílení celé, pokus se nezdaří s narušení sdílení. Tento výsledek lze očekávat, protože služba musí mít výhradní přístup po dobu trvání operace na souboru. Chcete-li tento problém vyřešit, opakujte akci po krátkou dobu později. Služba je často vyplněné soubor během několika milisekund.

Obě příčiny pro sdílení porušení popsané výše musí být zpracován podobně. Při otevření souboru je nutné vždy zajistit narušení sdílení bezproblémové způsobem tak, aby není ovlivnit uživatele systému nebo způsobit selhání systému. Lze provést pomocí mechanismu jednoduché opakování. Bude pravděpodobně třeba provést více pokusů, soubor je odemčena.

Následující ukázka kódu znázorňuje tuto techniku:

#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.
}

Tuto metodu pro řádné zpracování sdílení chyba narušení poskytuje aplikace, která má soubor otevřen, doba potřebná k dokončení. Pokaždé, když zobrazí k chybě narušení sdílení, musíte povolit aplikace do režimu spánku na chvíli a akci opakujte. Pokud program pro vyhledávání virů nebo systémová služba může po jedné nebo dvou pokusech dokončení otevření souboru, může antivirový program nebo systémová služba. Přesvědčte se, zda omezit své opakování Chcete-li zabránit nekonečné smyčce. Pokud jiná aplikace aktuálně má soubor otevřít (a může ponechat soubor otevřít po dlouhou dobu), informovat uživatele pomocí jejich rozdělení smyčky a řádné ukončení.
Vlastnosti

ID článku: 316609 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor