O Windows assume como padrão o bloqueio automático e obrigatório de arquivos. O UNIX padrão é o bloqueio manual e cooperativo de arquivos. Nos dois casos, os padrões podem ser substituídos, mas nos dois casos 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 permite especificar como o bloqueio obrigatório funcionará, para que você obtenha os padrões. O "modo de compartilhamento" padrão tende a proibir operações "conflitantes". Se você abrir um arquivo para gravação, presume-se que as gravações entrem em conflito, mesmo que você nunca grave no arquivo. O mesmo vale para renomear.
E aqui é onde fica pior. Além da abertura para leitura ou gravação, a API C / C ++ não fornece nenhuma maneira de especificar o que você pretende fazer com o arquivo. Portanto, a API deve assumir que você executará qualquer operação legal. Como o bloqueio é obrigatório, um open
que permita que uma operação conflitante seja recusada, 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 usar a API C / C ++ ou usar a API nativa sem pensar especificamente sobre esses problemas, eles impedirão o conjunto máximo de operações possíveis para cada arquivo que abrirem e não conseguirão abrir um arquivo, a menos que sejam possíveis todas as operações possíveis. pode executar nele uma vez aberto é sem conflito.
Na minha opinião, o método Windows funcionaria muito melhor do que o método UNIX se todos os programas escolhessem seus modos de compartilhamento e modos abertos, com sabedoria e sanidade, lidando com casos de falha. O método UNIX, no entanto, funciona melhor se o código não se importar em pensar sobre esses problemas. Infelizmente, a API básica do C / C ++ não é bem mapeada para a API de arquivos do Windows de uma maneira que lida com os modos de compartilhamento e os conflitos se abrem bem. Portanto, o resultado líquido é um pouco confuso.