PROBLEMA: Mensagem de erro ERROR_SHARING_VIOLATION quando a função CreateFile falha

Traduções de Artigos Traduções de Artigos
Artigo: 316609 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Quando abre um ficheiro com o sinalizador FILE_SHARE_READ e o sinalizador FILE_SHARE_WRITE, a função CreateFile poderá falhar e voltar a seguinte mensagem de erro:
ERROR_SHARING_VIOLATION (código de erro 32)

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Quando abre um ficheiro utilizando a função CreateFile ou qualquer função que utiliza internamente CreateFile , poderá detectar uma falha inesperada devido a uma violação de partilha. Se o ficheiro for apenas para uma aplicação específica, existem potencialmente outros processos que poderão tentar aceder ao ficheiro ao mesmo tempo. Existem componentes de sistema comuns e também outras aplicações de outros fabricantes que provocam este problema. Existem componentes de sistema comuns e também aplicações de outros fabricantes (tais como a detecção de vírus software) que causa este problema.

O sistema operativo Microsoft Windows é um sistema de multiprocessamento preemptive, dando o aspecto de muitas aplicações em execução em simultâneo. Qualquer aplicação específica tem de ser "conhecimento" que não é o único processo em execução no sistema e que é vying para recursos com outros processos. Problemas que podem ocorrer devido a processamento de recursos devem ser endereçados. No caso de ficheiros, qualquer processo em execução tem o direito para tentar utilizar o recurso. Existem sempre componentes do sistema e serviços de terceiros que competir para recursos em simultâneo. Quando uma aplicação tenta aceder a ficheiros no sistema, aplicação competes com outros processos.

Existem duas causas comuns para um ERROR_SHARING_VIOLATION:
  • Existem várias aplicações que utilizam um determinado ficheiro no disco (ficheiros de dados partilhados comuns). Uma aplicação está actualmente a aceder ao ficheiro de forma que é incompatível com a forma como uma segunda aplicação tenta aceder ao mesmo ficheiro. Por exemplo, poderá pretender actualizar o ficheiro, mas outro processo actualmente escrever no ficheiro e só está a partilhar o ficheiro para leitura (FILE_SHARE_READ).
  • O ficheiro é um ficheiro de dados específico da aplicação e pensa que outra aplicação para que o ficheiro aberto. Neste cenário, outros processos podem bloquear um ficheiro para uma duração curta por outras razões.
O problema mais comum ocorre quando um utilitário, tal como um detector de vírus, software de cópia de segurança e uma optimização do disco, que bloqueia um ficheiro no disco durante um curto período de tempo. Quando outra aplicação tenta abrir o ficheiro, mesmo com full partilha activada, a tentativa falhar com uma violação de partilha. Pode esperar que este resultado porque o serviço têm de ter acesso exclusivo para a duração da operação no ficheiro. Para resolver este problema, tente novamente um curto período de tempo mais tarde. Frequentemente, o serviço é concluído com o ficheiro numa questão de milissegundos.

Ambas as causas para partilha violações descritas anteriormente devem ser tratadas da mesma forma. Quando abre um ficheiro, deve processar sempre uma violação de partilha de uma forma com êxito para que não afectar o utilizador do sistema ou fazer com que o sistema falhar. Pode fazê-lo utilizando um mecanismo de repetição simples. Poderá ter de efectuar várias tentativas antes do ficheiro está desbloqueado.

O código de exemplo seguinte demonstra 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.
}
				
este método para processar correctamente o erro de violação de partilha permite uma aplicação que tenha o ficheiro aberto tempo a concluir. Sempre que receber um erro de violação de partilha, deve permitir a aplicação a suspensão durante algum tempo e tente novamente. Se um detector de vírus ou um serviço de sistema tiver o ficheiro aberto, o detector de vírus ou o serviço de sistema poderá ser concluída depois de uma ou duas tentativas. Certifique-se de que limite o número de tentativas para evitar um ciclo infinito. Se outra aplicação actualmente tem o ficheiro aberto (e pode manter o ficheiro aberto durante um longo período de tempo), informar o utilizador por quebrar do ciclo e, em seguida, sair correctamente.

Propriedades

Artigo: 316609 - Última revisão: 21 de novembro de 2006 - Revisão: 1.2
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface
Palavras-chave: 
kbmt kbfileio kbkernbase kbprb KB316609 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316609
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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