O Windows é padronizado para o bloqueio automático e obrigatório de arquivos. O padrão do UNIX é o bloqueio manual e cooperativo de arquivos. Em ambos os casos, os padrões podem ser anulados, mas em ambos os casos eles geralmente não são.
Muitos códigos antigos do Windows usam a API C / C ++ (funções como fopen
) em vez da API nativa (funções como CreateFile
). A API C / C ++ não oferece nenhuma maneira de especificar como o bloqueio obrigatório funcionará, portanto, você obtém os padrões. O "modo de compartilhamento" padrão tende a proibir operações "conflitantes". Se você abrir um arquivo para escrever, as gravações serão consideradas conflitantes, mesmo se você nunca realmente gravar no arquivo. Idem para renomear.
E aqui é onde fica pior. Além de abrir para leitura ou gravação, a API C / C ++ não fornece nenhuma maneira de especificar o que você pretende fazer com o arquivo. Então a API tem que assumir que você vai realizar qualquer operação legal. Como o bloqueio é obrigatório, um open
que permite uma operação conflitante será recusado, mesmo que o código nunca pretenda executar a operação conflitante, mas esteja apenas abrindo o arquivo para outra finalidade.
Portanto, se o código usa a API C / C ++ ou usa a API nativa sem pensar especificamente sobre esses problemas, eles acabam impedindo o conjunto máximo de operações possíveis para cada arquivo aberto e sendo incapazes de abrir um arquivo, a menos que a operação possível que eles poderiam realizar nele, uma vez aberta, não é afetada.
Na minha opinião, o método Windows funcionaria muito melhor do que o método UNIX se cada programa escolhesse seus modos de compartilhamento e abrisse os modos de casos de falha com cuidado e de forma sábia. O método UNIX, no entanto, funciona melhor se o código não se incomodar em pensar sobre esses problemas. Infelizmente, a API C / C ++ básica não é bem mapeada na API de arquivos do Windows de uma maneira que lida bem com os modos de compartilhamento e as janelas conflitantes. Então, o resultado líquido é um pouco confuso.