PRB: Messaggio di errore ERROR_SHARING_VIOLATION quando la funzione CreateFile non funziona

Traduzione articoli Traduzione articoli
Identificativo articolo: 316609 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

Sintomi

Quando si apre un file con il flag FILE_SHARE_READ e il flag FILE_SHARE_WRITE, la funzione CreateFile potrebbe avere esito negativo e restituirÓ il seguente messaggio di errore:
ERROR_SHARING_VIOLATION (codice di errore 32)

Status

Questo comportamento legato alla progettazione.

Informazioni

Quando si apre un file utilizzando la funzione CreateFile o una qualsiasi funzione che utilizza internamente CreateFile , potrebbero verificarsi un errore imprevisto a causa di una violazione di condivisione. Anche se il file Ŕ solo per un'applicazione specifica, esistono in modo univoco potenzialmente altri processi che tentano di accedere al file nello stesso momento. Esistono componenti comuni di sistema e anche altre applicazioni di terze parti che causano questo problema. Esistono componenti comuni di sistema e anche applicazioni di terze parti (ad esempio antivirus software) che causano questo problema.

Il sistema operativo Microsoft Windows Ŕ un tipo preemptive, sistema di multiprocessing, che conferisce l'aspetto di molte applicazioni in esecuzione contemporaneamente. Un'applicazione specifica deve essere "consapevole" che non Ŕ il solo processo in esecuzione sul sistema e che esso Ŕ vying per le risorse con altri processi. ╚ necessario risolvere problemi che possono verificarsi a causa di gestione di risorse. Nel caso di file, qualsiasi processo in esecuzione dispone del diritto per tentare di utilizzare la risorsa. Vi sono sempre i componenti del sistema e servizi di terze parti che competere per le risorse contemporaneamente. Quando un'applicazione tenta di accedere ai file del sistema, applicazione concorrere con di altri processi.

Esistono due cause pi¨ comuni per un ERROR_SHARING_VIOLATION:
  • Sono presenti pi¨ applicazioni che utilizzano un determinato file sul disco (file di dati condivisi comuni). Un'applicazione utilizzato per l'accesso il file in modo che sia compatibile con la modalitÓ di che una seconda applicazione tenta di accedere allo stesso file. Ad esempio, si desideri aggiornare il file, ma Ŕ solo condivisione il file per la lettura (FILE_SHARE_READ) e attualmente Ŕ scrivere nel file di un altro processo.
  • Il file Ŕ un file di dati specifico dell'applicazione e non si prevede che il file si apra un'altra applicazione. In questo scenario, gli altri processi possono bloccare un file per una durata breve per altri motivi.
Il problema pi¨ comune si verifica quando un'utilitÓ, ad esempio un programma antivirus, software di backup o un ottimizzatore di disco, che blocca un file su disco per un breve periodo di tempo. Quando un'altra applicazione tenta di aprire il file, anche con attivata la condivisione completa, il tentativo non riesce con una violazione di condivisione. ╚ possibile prevedere questo risultato perchÚ il servizio deve avere accesso esclusivo per la durata dell'operazione sul file. Per risolvere questo problema, provare nuovamente un breve periodo di tempo in un secondo momento. Spesso, il servizio viene completato con il file in pochi millisecondi.

Entrambe le cause di descritto in precedenza di violazioni di condivisione deve essere gestiti in modo analogo. Quando si apre un file, Ŕ sempre necessario gestire una violazione di condivisione in modo regolare in modo che non interessano l'utente del sistema o causare l'arresto anomalo del sistema. Questo scopo Ŕ possibile utilizzando un meccanismo semplice tentativi. Potrebbe essere necessario eseguire pi¨ tentativi prima che il file viene sbloccato.

Nell'esempio di codice riportato di seguito questa tecnica Ŕ illustrato:
#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.
}
				
questo metodo per gestire correttamente l'errore di violazione di condivisione consente a un'applicazione che il file di apertura per il completamento. Ogni volta che si riceve un errore di violazione di condivisione, Ŕ necessario consentire all'applicazione di sospensione per un periodo di tempo e riprovare. Se un programma antivirus o un servizio di sistema dispone del file aperto, il programma antivirus o il servizio di sistema potrebbe fine dopo tentativi di uno o due. Assicurarsi di limitare i tentativi per evitare un ciclo infinito. Se un'altra applicazione attualmente il file Ŕ aperto (e pu˛ mantenere il file aperto per un lungo periodo di tempo), informare l'utente suddividendo all'esterno del ciclo e quindi chiudere normalmente.

ProprietÓ

Identificativo articolo: 316609 - Ultima modifica: martedý 21 novembre 2006 - Revisione: 1.2
Le informazioni in questo articolo si applicano a:
  • Microsoft Win32 Application Programming Interface
Chiavi:á
kbmt kbfileio kbkernbase kbprb KB316609 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 316609
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Dichiarazione di non responsabilitÓ per articoli della Microsoft Knowledge Base su prodotti non pi¨ supportati
Questo articolo Ŕ stato scritto sui prodotti per cui Microsoft non offre pi¨ supporto. L?articolo, quindi, viene offerto ?cosý come Ŕ? e non verrÓ pi¨ aggiornato.

Invia suggerimenti

 

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