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!

Foi útil?

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.

http://www.codeproject.com/KB/IP/bitsman.aspx

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.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top