Isso realmente depende de duas coisas: como o arquivo está sendo substituído e qual é o sistema operacional subjacente ao servidor WWW. Aqui estão três exemplos para mostrar como isso faz a diferença:
-
Um sistema operacional compatível com POSIX usando
mv
para atualizar o arquivo de um arquivo temporário pré-preparado:mv
tem garantia de chamar (ou se comportar como)rename()
, que por sua vez, de acordo com a especificação POSIX, garante que em todos os momentos o nome do arquivo alvo, neste casoindex.html
, sempre referencie alguns arquivo, seja ele original ou novo. E o conteúdo do arquivo nunca estará em um estado parcialmente escrito.O mesmo vale para um servidor FTP / HTTP que faz upload para um arquivo temporário e chama
rename()
, quando o arquivo temporário é completamente carregado, para mover o arquivo temporário para o destino especificado. -
Microsoft Windows usando o um comando
MOVE
de algum tipo para atualizar o arquivo um arquivo temporário pré-preparado: A implementação usual de um comandoMOVE
(como pode ser visto aqui em a origem do comando ReactOSMOVE
) é chamarMoveFileEx()
com o sinalizadorMOVEFILE_REPLACE_EXISTING
definido. Isso, pelo menos no Windows NT (porque o sinalizador é passado para os drivers do sistema de arquivos que são necessários para suportar renomeações atômicas), garante que um arquivo chamadoindex.html
sempre existirá, como com POSIX erename()
.O mesmo vale para um servidor FTP / HTTP que faz o upload para um arquivo temporário e que chama
MoveFileEx()
, quando o arquivo temporário é completamente carregado, para mover o arquivo temporário para o destino especificado. -
Microsoft Windows usando o um comando
COPY
de algum tipo para atualizar o arquivo de um arquivo temporário pré-preparado: O comandoCOPY
não usaMoveFileEx()
. Em vez disso, ele abre o arquivo existente, truncando-o para comprimento zero e o reescreve no lugar (novamente, cfCopyFileEx()
no ReactOS . Embora nunca haja um ponto em que o nomeindex.html
não aponte para um arquivo, o arquivo para o qual ele aponta estará em um estado parcialmente escrito durante o processo de cópia, e é possível que o servidor WWW sirva.O mesmo vale para um servidor FTP / HTTP que (a) apenas carrega arquivos no lugar, truncando e substituindo os originais, ou (b) enviando para um arquivo temporário, mas depois copia o arquivo temporário para o destino especificado.
Resumindo: Se você estiver enviando por meio de um servidor FTP / HTTP, isso depende de como o servidor FTP / HTTP funciona internamente. Se você estiver modificando diretamente a área de armazenamento de arquivos do servidor WWW, isso dependerá de quais ferramentas você usa para fazer isso.