
Eu tenho um processo que é executado todo mês ou mais. Esse processo identifica um conjunto de arquivos e constrói um caminho de origem e destino adequado a partir de vários campos de tabelas diferentes no banco de dados para depois copiar todos esses arquivos, de modo que acabo com potencialmente centenas de milhares ou milhões de caminhos. É possível que esses caminhos apontem para um arquivo que foi copiado anteriormente, mas foi modificado.
Como posso realizar esta cópia da maneira mais rápida possível?
Tentei primeiro um script cmd simples e enorme verificando se o arquivo, por caminho resultante, existia no caminho de destino e depois tentei copiar se não existisse, mas os arquivos modificados foram ignorados. Então, tentei usar "xcopy" para evitar a substituição se a data for a mesma, usando a opção /D e a opção /Y para confirmar silenciosamente o prompt, mas na prática, um script enorme com centenas de milhares de comandos xcopy leva para sempre e não vejo nenhuma aceleração quando alguns ou a maioria desses arquivos já existem com a mesma data. Você tem alguma idéia que possa me ajudar? O que posso fazer com um arquivo contendo centenas de caminhos de origem e destino para fazer uma cópia de tudo isso? Existe uma alternativa mais rápida ao xcopy? ou uma verificação de data mais rápida e depois chamar qualquer comando de cópia?
Uma explicação mais detalhada sobre como atualmente obtenho e copio arquivos com base nas informações do banco de dados: Existem várias tabelas no banco de dados:
Tabela 1: ID, Dir_Name, ...
Tabela 2: ID, Dir_Name, ...
...
Tabela N: ID, Dir_Name, ...
Tabela de caminhos de pasta de origem: Dir_Name, Dir_FullPath
Tabela de caminhos de pasta de destino: Dir_Name, Dir_FullPath
Então posso criar o conjunto de comandos de cópia (ou apenas obter os caminhos de origem e destino)
Select 'xcopy /d /y '|| T2.Dir_FullPath || '\\' || ID || '.ext ' || T3.Dir_FullPath || '\\' || ID || '.ext*'
from Table1 T1
left join SourceFolderPathsTable T2 on T1.Dir_Name=T2.Dir_Name
left join DestFolderPathsTable T3 T1.Dir_Name=T3.Dir_Name where T1.some_criteria=true;
Obrigado!
Responder1
Dê uma olhada na ferramenta de linha de comando “robocopy” que vem com o Windows. Acredito que ele pode aceitar um arquivo de resposta e já pode ser instruído a atualizar apenas arquivos que mudaram datas/horas, além de ser o mais rápido possível, sendo pura linha de comando sem sobrecarga de GUI.