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

Traduções deste artigo Traduções deste artigo
ID do artigo: 316609 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Quando você abre um arquivo com o sinalizador FILE_SHARE_READ e o sinalizador FILE_SHARE_WRITE, a função CreateFile pode falhar e retornar a seguinte mensagem de erro:
ERROR_SHARING_VIOLATION (código de erro 32)

Situação

Esse comportamento é por design.

Mais Informações

Quando você abre um arquivo usando a função CreateFile ou qualquer função que usa internamente CreateFile , você pode enfrentar uma falha inesperada devido a uma violação de compartilhamento. Mesmo se o arquivo for somente para um aplicativo específico, há potencialmente outros processos que podem tentar acessar o arquivo ao mesmo tempo. Há componentes comuns do sistema e também outros aplicativos de terceiros que causam esse problema. Há componentes comuns do sistema e também os aplicativos de terceiros (como verificação de vírus software) que causa esse problema.

O sistema operacional Microsoft Windows é um sistema preemptiva, do multiprocessamento, que fornece a aparência de vários aplicativos em execução simultaneamente. Qualquer aplicativo específico deve estar "ciente" que não é o único processo em execução no sistema e que ele é vying para recursos com outros processos. Problemas que podem ocorrer devido à manipulação de recurso devem ser tratados. No caso de arquivos, qualquer processo em execução tem o direito para tentar usar o recurso. Sempre há componentes do sistema e serviços de terceiros que competem para recursos simultaneamente. Quando um aplicativo tenta acessar arquivos no sistema, que aplicativo concorre com outros processos.

Há duas causas comuns de um ERROR_SHARING_VIOLATION:
  • Há vários aplicativos que usam um determinado arquivo no disco (arquivos de dados compartilhados comuns). Um aplicativo no momento está acessando o arquivo de uma maneira que é incompatível com a maneira como um segundo aplicativo tenta acessar o mesmo arquivo. Por exemplo, convém atualizar o arquivo, mas outro processo no momento é gravar no arquivo e só está compartilhando o arquivo para leitura (FILE_SHARE_READ).
  • O arquivo é um arquivo de dados específico para seu aplicativo, e você não espera que outro aplicativo para que o arquivo seja aberto. Nesse cenário, outros processos podem bloquear um arquivo por um período curto por outros motivos.
O problema mais comum ocorre quando um utilitário, como um programa antivírus, software de backup ou uma otimização de disco, que bloqueia um arquivo no disco por um curto período de tempo. Quando outro aplicativo tenta abrir o arquivo, mesmo com total compartilhamento ativado, a tentativa falhará com uma violação de compartilhamento. Você pode esperar que esse resultado porque o serviço deve ter acesso exclusivo para a duração da operação no arquivo de. Para resolver esse problema, tente novamente um curto período de tempo mais tarde. Com freqüência, o serviço é preenchido com o arquivo em questão de milissegundos.

As duas causas para descrito anteriormente violações de compartilhamento devem ser tratadas da mesma forma. Quando você abre um arquivo, você sempre deve controlar uma violação de compartilhamento de maneira normal, para que não afetam o usuário do sistema ou fazer com que o sistema falha. Você pode fazer isso usando um mecanismo simples repetição. Talvez você precise executar várias tentativas antes do arquivo seja desbloqueado.

O exemplo de código a seguir demonstra essa 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.
}
				
esse método para manipular o erro de violação de compartilhamento normalmente fornece um aplicativo que tenha o arquivo aberto tempo para concluir. Cada vez que você recebe um erro de violação de compartilhamento, você deve permitir que o aplicativo para suspensão por um tempo e tente novamente. Se tiver um scanner de vírus ou um serviço do sistema o arquivo aberto, o verificador de vírus ou o serviço do sistema pode terminar após tentativas de um ou dois. Certifique-se de que você limite de tentativas para evitar um loop infinito. Se outro aplicativo atualmente tem o arquivo aberto (e pode manter o arquivo aberto por um longo tempo), informar ao usuário dividindo do loop e sair normalmente.

Propriedades

ID do artigo: 316609 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 1.2
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32
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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316609
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

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