Em que ponto o Robocopy sobrescreve um arquivo?

1

Estou executando um .bat contendo:

robocopy \server\directory\ .\localdir /MIR

Isso move um único arquivo de um servidor para o meu diretório local.

É um arquivo grande e demorará um pouco para ser concluído, mas posso conseguir o que preciso com uma cópia existente do arquivo nesse local.

Em que ponto exatamente o arquivo será sobrescrito? Posso sair dele e usar o arquivo que estava em \ localdir antes que o .bat comece a rodar? Ou preciso esperar que o robocopy termine?

    
por StuperUser 25.05.2016 / 16:26

1 resposta

1

robocopy não é diferente de qualquer outro programa de cópia de arquivos. Uma cópia sobrescrita "trunca" os dados existentes no arquivo e começa a gravar os novos dados. Você pode observar isso com um programa que monitora as APIs do sistema chamadas por robocopy, como uma das opções listadas aqui . Então você só precisa procurar cada chamada de API no MSDN para entender exatamente o que está acontecendo.

Primeiro, ele chama SetFilePointerEx para procure o início do arquivo (se ainda não estiver lá). Em seguida, ele chama SetEndOfFile para truncar o arquivo para o marcador BOF (tornando-o um arquivo de zero bytes). Isso tudo acontece tão rápido que, efetivamente, assim que esse comando começa a ser executado, os dados originais do arquivo são "perdidos" para todos os efeitos (os blocos que representaram o fluxo de dados do arquivo serão substituídos no todo ou em parte por gravações NTFS futuras). comandos).

Se você quisesse fazer isso "atomicamente", poderia fazer uma operação de renomeação, assim:

  1. Copie o conteúdo do arquivo (usando robocopy) do servidor para um nome de caminho exclusivo em seu sistema local que NOT exista atualmente (por exemplo, se o arquivo é chamado foo , você pode copiá-lo para foo.bak .)

  2. Faça uma renomeação renomeando usando a função Renomear atômica da API do Windows que foi adicionada no Windows Vista (e, portanto, sem suporte no XP e anteriores, que exigem uma renomeação não atômica, possivelmente com bugs ou quebrada, não atômica; ouch): MoveFileTransacted () . Desta forma, você pode instantaneamente "trocar" os dados contidos no arquivo, do conteúdo do arquivo original para o conteúdo do novo arquivo. Isso significa que é impossível para qualquer programa ler um arquivo parcialmente completo - ele lê a cópia original (completa, inalterada), ou para ler o arquivo completo, cópia atualizada inalterada. Ele nunca lerá uma cópia "incompleta" ou uma combinação ilegível de ambos os arquivos.

As desvantagens desse método alternativo são:

  • Eu não sei de um programa que já faz isso fora da caixa;
  • Como você ainda tem o arquivo original enquanto está fazendo sua cópia, é necessário ter o dobro de armazenamento. Portanto, se você pretende substituir um arquivo de 1 GiB por outro arquivo de 1 GiB, precisará de um total de 2 GiB de armazenamento no sistema local, ainda que temporariamente.
  • Funciona apenas com o NTFS transacional. Isso significa que se o sistema de arquivos de origem ou o sistema de arquivos de destino para a sobregravação transacional não for NTFS, não funcionará. Você ainda pode fazer o robocopy do arquivo de um compartilhamento de rede para o sistema local, mas a renomeação atômica não funcionará em um compartilhamento de rede ou (a menos que seja adicionada no futuro) no ReFS, que pode algum dia tornar-se nosso sistema de arquivos padrão, como o NTFS fez em FAT32 anos atrás.
por 25.05.2016 / 16:43

Tags