PRB: ERROR_SHARING_VIOLATION mensaje al error de la función CreateFile

Seleccione idioma Seleccione idioma
Id. de artículo: 316609 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Cuando abre un archivo con el indicador FILE_SHARE_READ y el indicador FILE_SHARE_WRITE, la función CreateFile puede fallar y devolver el siguiente mensaje de error:
ERROR_SHARING_VIOLATION (código de error 32)

Estado

Este comportamiento es por diseño.

Más información

Cuando abre un archivo mediante la función CreateFile o cualquier función que utiliza internamente CreateFile , puede experimentar un error inesperado debido a una infracción de uso compartido. Incluso si el archivo es sólo para una aplicación específica, hay potencialmente a otros procesos que pueden intentar tener acceso al archivo al mismo tiempo. Hay componentes de sistema comunes y también otras aplicaciones de terceros que causan este problema. Hay componentes de sistema comunes y también aplicaciones de terceros (como la detección de virus software) que causan este problema.

El sistema operativo Microsoft Windows es un preferente, sistema de multiproceso, que ofrece la apariencia de muchas aplicaciones que se ejecute simultáneamente. Cualquier aplicación determinada debe "conocer" que no es el único proceso que se ejecutan en el sistema y que es que compiten para recursos con otros procesos. Deben solucionarse problemas que pueden producirse del tratamiento de recursos. En el caso de archivos, cualquier proceso en ejecución tiene derecho a intentar utilizar el recurso. Siempre hay componentes del sistema y servicios de terceros que compiten por los recursos simultáneamente. Cuando una aplicación intenta obtener acceso a archivos del sistema, aplicación compite con los demás procesos.

Hay dos causas comunes para un ERROR_SHARING_VIOLATION:
  • Hay varias aplicaciones que utilizan un determinado archivo en disco (archivos de datos compartida común). Una aplicación tiene acceso actualmente el archivo de forma que es incompatible con la forma en que una segunda aplicación intenta obtener acceso al mismo archivo. Por ejemplo, puede que desee actualizar el archivo, pero otro proceso está escribiendo actualmente en el archivo y sólo comparte el archivo para leer (FILE_SHARE_READ).
  • El archivo es un archivo de datos específico a la aplicación y no esperan que otra aplicación tiene abierto el archivo. En este escenario, otros procesos pueden bloquear un archivo para una duración corta por otras razones.
El problema más común se produce cuando una utilidad, como un detector de virus, software de copia de seguridad o un optimizador de disco, que bloquea un archivo en disco durante un breve período de tiempo. Cuando otra aplicación intenta abrir el archivo, incluso con compartir completa activado, el intento produce un error con una infracción al compartir. Puede esperar este resultado porque el servicio debe tener acceso exclusivo durante la operación en el archivo. Para resolver este problema, intente volver a un breve período de tiempo más adelante. Con frecuencia, el servicio se ha completado con el archivo en cuestión de milisegundos.

Dos de las causas para compartir infracciones descritas anteriormente deben controlarse de forma similar. Cuando abre un archivo, siempre debe controlar una infracción de acceso de forma correcta para que no afectan al usuario del sistema o provocar que el sistema de bloqueo. Puede hacerlo mediante un mecanismo de reintento simple. Quizás tenga que realizar varios reintentos antes de que el archivo está desbloqueado.

En el siguiente ejemplo de código se muestra esta técnica:
#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.
}
				
ofrece a este método para controlar el error de infracción de uso compartido de correctamente una aplicación que tiene el archivo abierto tiempo en completarse. Cada vez que reciba un error de infracción de recurso compartido, debe permitir la aplicación de suspensión durante un tiempo y vuelva a intentarlo. Si tiene un detector de virus o un servicio del sistema puede finalizar el archivo abierto, el detector de virus o el servicio del sistema después de uno o dos reintentos. Asegúrese de que limite los reintentos para evitar un bucle infinito. Si otra aplicación actualmente tiene abierto el archivo (y puede mantener abierto el archivo durante un largo período de tiempo), informar al usuario dividiendo del bucle y salga correctamente.

Propiedades

Id. de artículo: 316609 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 1.2
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface
Palabras clave: 
kbmt kbfileio kbkernbase kbprb KB316609 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 316609
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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