MODÈLE : message d'erreur ERROR_SHARING_VIOLATION lors de l'échec de la fonction CreateFile

Traductions disponibles Traductions disponibles
Numéro d'article: 316609 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Symptômes

Lorsque vous ouvrez un fichier avec l'indicateur FILE_SHARE_READ et l'indicateur FILE_SHARE_WRITE, la fonction CreateFile peut échouer et retourner le message d'erreur suivant :
ERROR_SHARING_VIOLATION (code d'erreur 32)

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Lorsque vous ouvrez un fichier à l'aide de la fonction CreateFile ou de toute fonction par CreateFile en interne, vous pouvez rencontrer une défaillance inattendue en raison d'une violation de partage. Même si le fichier est uniquement pour une application spécifique, il existe potentiellement autres processus qui peuvent tentent d'accéder au fichier en même temps. Il existe des composants système communs et également autres applications tierces qui provoquer ce problème. Il existe des composants système communs et également les applications tierces (comme l'analyse de virus logiciels) qui provoquer ce problème.

Le système d'exploitation Microsoft Windows est un système de multitraitement preemptive, qui donne l'aspect de nombreuses applications exécutées simultanément. N'importe quelle application particulière doit être « conscient » qu'il n'est pas le seul processus en cours d'exécution sur le système et est vying pour les ressources avec d'autres processus. Problèmes qui peuvent se produire en raison de gestion des ressources doivent être indiquées. Dans le cas des fichiers, un processus en cours d'exécution dispose du droit pour essayer d'utiliser la ressource. Il sont toujours des composants du système et des services tiers faisant concurrence pour les ressources simultanément. Lorsqu'une application tente d'accéder aux fichiers sur le système, application concurrence avec d'autres les processus.

Il y a deux causes courantes pour un ERROR_SHARING_VIOLATION :
  • Il existe plusieurs applications qui utilisent un fichier particulier sur le disque (fichiers de données partagées courants). Une application est actuellement accès au fichier d'une façon qui est incompatible avec la manière dont une deuxième application tente d'accéder au même fichier. Par exemple, vous pouvez mettre à jour le fichier, mais un autre processus est actuellement écrire dans le fichier et seulement partage le fichier de lecture (FILE_SHARE_READ).
  • Le fichier est un fichier de données spécifique à votre application, et vous ne prévoyez pas une autre application a ouvert le fichier. Dans ce scénario, les autres processus peuvent verrouiller un fichier pour une durée courte pour d'autres raisons.
Le problème plus courant se produit lorsqu'un utilitaire, tel qu'un logiciel antivirus, logiciel de sauvegarde ou une optimisation de disque, qui verrouille un fichier sur disque pour un court moment. Lorsqu'une autre application essaie d'ouvrir le fichier, même avec le partage complet est activée, la tentative échoue avec une violation de partage. Vous pouvez vous attendre à ce résultat, car le service doit disposer un accès exclusif pour la durée de l'opération sur le fichier. Pour résoudre ce problème, essayez à nouveau un court instant par la suite. Souvent, le service est renseigné avec le fichier en quelques millisecondes.

Deux les causes de partage violations décrites plus haut doivent être traités de la même façon. Lorsque vous ouvrez un fichier, vous devez toujours gérer une violation de partage d'une manière appropriée afin que vous ne pas affecter l'utilisateur du système ou provoquer l'incident du système. Ce faire, vous pouvez utiliser un mécanisme simple de nouvelle tentative. Vous devrez peut-être effectuer plusieurs tentatives avant le fichier est déverrouillé.

L'exemple de code suivant montre cette technique :
#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.
}
				
cette méthode pour gérer correctement l'erreur de violation de partage fournit une application qui a ouvert de temps pour achever le fichier. Chaque fois que vous recevez une erreur de violation de partage, vous devez autoriser l'application mise en veille pendant un certain temps et réessayez. Si un logiciel antivirus ou un service système a l'ouverture du fichier, l'antivirus ou le service système de peut fin après un ou deux tentatives. Assurez-vous que vous limiter vos tentatives pour éviter une boucle infinie. Si une autre application actuellement a ouvert le fichier (et peut conserver le fichier ouvert pendant une longue durée), informer l'utilisateur en rupture hors de la boucle et puis quittez normalement.

Propriétés

Numéro d'article: 316609 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 1.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface
Mots-clés : 
kbmt kbfileio kbkernbase kbprb KB316609 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 316609
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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