Copiando arquivos em uma conexão de rede intermitente
-
09-06-2019 - |
Pergunta
Estou procurando uma maneira robusta de copiar arquivos em um compartilhamento de rede do Windows que seja tolerante à conectividade intermitente.O aplicativo é frequentemente usado em estações de trabalho móveis sem fio em grandes hospitais, e presumo que a conectividade pode ser perdida momentaneamente ou por vários minutos de cada vez.Os arquivos envolvidos têm normalmente cerca de 200 KB a 500 KB.O aplicativo é escrito em VB6 (ugh), mas frequentemente acabamos usando chamadas DLL do Windows.
Obrigado!
Solução
Não estou claro qual é o seu problema real, então vou apresentar algumas idéias.
- Você deseja cópias reinicializáveis (com tamanhos de arquivo tão pequenos que não parece grande coisa)?Se sim, olhe CopyFileEx com COPYFILERESTARTABLE
- Você quer cópias verificáveis?Parece que você já fez isso verificando os hashes.
- Você quer melhor desempenho?Vai ser difícil, pois parece que você não consegue executar nada no servidor.De outra forma, TransmitirArquivo pode ajudar.
- Você quer apenas um incêndio e esquecer a operação?Suponho que estou gastando com a robocópia, ou TeraCopy ou algo funcionaria - mas parece um pouco hackeado para mim.
- Quer saber quando a rede volta? A rede está viva tem sua resposta.
Com base no que sei até agora, acho que o seguinte pseudocódigo seria minha abordagem:
sourceFile = Compress("*.*");
destFile = "X:\files.zip";
int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE;
while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) {
do {
// optionally, increment a failed counter to break out at some point
Sleep(1000);
while (!IsNetworkAlive(NETWORKALIVELAN));
}
Compactar os arquivos primeiro evita o rastreamento de quais arquivos você copiou com sucesso e quais você precisa reiniciar.Ele também deve fazer com que a cópia seja mais rápida (tamanho total de arquivo menor e tamanho de arquivo único maior), às custas de alguma potência da CPU em ambos os lados.Um simples arquivo em lote pode descompactá-lo no lado do servidor.
Outras dicas
eu usei Robocópia para isso com excelentes resultados.Por padrão, ele tentará novamente a cada 30 segundos até que o arquivo seja transmitido.
Tente usar o BITS (serviço de transferência inteligente em segundo plano).É a infraestrutura que o Windows Update usa, acessível por meio da API Win32 e criada especificamente para resolver isso.
Geralmente é usado para atualizações de aplicativos, mas deve funcionar bem em qualquer situação de movimentação de arquivos.
Concordo com o Robocopy como solução... é por isso que o utilitário é chamado "Cópia robusta de arquivo"
Usei o Robocopy para isso com excelentes resultados.Por padrão, ele tentará novamente a cada 30 segundos até que o arquivo seja transmitido.
E por padrão, um milhão de tentativas.Isso deve ser suficiente para sua conexão intermitente.
Ele também faz transferências reinicializáveis e você pode até mesmo acelerar as transferências com um intervalo entre os pacotes, desde que você não queira usar toda a largura de banda, pois outros programas estão usando a mesma conexão (switch / IPG).
Que tal simplesmente enviar um hash antes ou depois de enviar o arquivo e compará-lo com o arquivo que você recebeu?Isso deve pelo menos garantir que você tenha um arquivo correto.
Se você quiser fazer tudo, pode fazer o mesmo processo, mas para pequenas partes do arquivo.Então, quando você tiver todas as peças, junte-as na extremidade receptora.
Você poderia usar o Microsoft SyncToy (gratuito).
Hm, parece que o rsync faz isso e não precisa de servidor/daemon/instalação, pensei que sim - apenas $ rsync src dst.
SMS, se estiver disponível, funciona.