em cima da solução usando ftp, em vez da WS central criar arquivos *.DAT com a descrição dos arquivos, utilize pastas ou subdiretórios com nomenclatura indicando a versão e/ou data da atualização... daí resolve o problema de conflito do cliente ler e a central escrever no mesmo arquivo.
Quando a central vai criar uma nova atualização, ela cria um subdiretório no ftp como por exemplo 2007_09_17_08_00 (atualização das 8:00 de 17/9/2007). Dentro desse diretório, ela cria um arquivo LOCK só como flag, coloca os arquivos de update e apaga o LOCK "liberando" a atualização. Caso as atualizações sejam diferentes para cada cliente, pode ser criado um subdiretório tipo Cliente01 e dentro desse subdiretório, colocar os subdiretórios das versões de update.
A lista de arquivos para update é simplesmente a listagem de todos os arquivos no subdiretório da versão de atualização utilizada.
O cliente, quando "resolve" fazer update, conecta-se ao ftp e pega a lista de subdiretórios, verifica a mais recente que não contenha o arquivo LOCK e pega todos os arquivos pra fazer a atualização necessária. Caso a versão que o cliente possui esteja muito defasada (quando o cliente percebe que existem várias versões mais novas que a dele, pode-se fazer a atualização um por um ou, se for possível, já atualizar pra mais recente duma vez. Obviamente o cliente deve armazenar a versão que ele tem instalado em algum lugar...
Essa estrutura de controle de versão dos updates por subdiretórios tem a vantagem de manter um "histórico" de updates, além de quase eliminar problema de concorrência de cliente com a central e também permitir que clientes com diferentes versões possam se atualizar sem problemas.
Outra solução semelhante é chutar o ftp e criar um servidor de arquivos central com um diretório compartilhado com esses subdiretórios... os clientes mapeariam ou acessariam esses arquivos por rede, podendo nesse caso, até usar o comando copy do shell do windows... o que seria mais fácil que o comando ShellExecute ->cmd ->copy? Todo mundo sabe usar copy...
Pra ser mais fácil que isso, só usando algum componente pronto pra delphi que controle update, ou, se conhecer, usar um servidor CVS e um cliente cvs de linha de comando com as configurações apropriadas pra sobrescrever sempre... mas se já tem um servidor ftp rodando, melhor usar ele, pelo menos fica 1/2 byte mais difícil do que o copy direto pra algum curioso ficar fuçando no servidor de update.
Se quiser facilitar a manutenção mais ainda, cada cliente pode criar um arquivo no raiz do ftp de atualização contendo a última versão que ele "pegou", atualizando sempre esse arquivo em cada update. Isso permite que uma rotina verifique todas as versões dos clientes e também possa apagar os updates que já não estão mais sendo utilizados... e dá pra fazer um "relatório" dos clientes... os clientes também podem colocar mais informações nesses arquivos de informação de update, como por exemplo, falhas ocorridas, número de acessos, etc.. daí dá pra criar uma rotina que varre esses arquivos e mostre o que tá acontecendo com cada cliente, sem sequer acessar o cliente.
PS. A solução por servidor de arquivo facilita o cliente pois pode-se usar linguagem shellscript pra fazer o copy, chutando o delphi pro lugar dele. Mas servidor de arquivos, CVS e FTP implica no cliente conhecer o endereço do servidor... a descrição do problema tava o inverso
