
У меня есть процесс, который запускается примерно раз в месяц. Такой процесс идентифицирует набор файлов и создает правильный исходный и целевой путь из нескольких полей различных таблиц в БД, чтобы затем скопировать все эти файлы, так что в итоге я получаю потенциально сотни тысяч или миллионы путей. Возможно, что эти пути указывают на файл, который был ранее скопирован, но был изменен.
Как мне выполнить это копирование максимально быстро?
Сначала я попробовал простой огромный скрипт cmd, проверяющий, существует ли файл по результирующему пути в целевом пути, а затем пытающийся скопировать его, если он не существует, но измененные файлы были пропущены. Поэтому затем я попытался использовать "xcopy", чтобы избежать перезаписи, если дата та же, используя ключ /D и ключ /Y для молчаливого подтверждения запроса, но на практике огромный скрипт с сотнями тысяч команд xcopy занимает целую вечность, и я не вижу никакого ускорения, когда некоторые или большинство этих файлов уже существуют с той же датой. Есть ли у вас какие-либо идеи, которые могут мне помочь? Что я могу сделать с файлом, содержащим сотни исходных и целевых путей, чтобы сделать копию всех из них? Есть ли более быстрая альтернатива xcopy? или более быстрая проверка даты и затем вызов любой команды копирования?
Более подробное объяснение того, как я в настоящее время получаю и копирую файлы на основе информации из БД: В БД есть несколько таблиц:
Таблица 1: ID, Dir_Name, ...
Таблица 2: ID, Dir_Name, ...
...
Таблица N: ID, Dir_Name, ...
Таблица путей к исходным папкам: Dir_Name, Dir_FullPath
Таблица путей к папкам назначения: Dir_Name, Dir_FullPath
Затем я могу создать набор команд копирования (или просто получить исходный и конечный пути)
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;
Спасибо!
решение1
Взгляните на инструмент командной строки "robocopy", который поставляется с Windows. Я думаю, что он может принять файл ответа, и ему уже можно приказать обновлять только файлы, у которых изменилась дата/время, плюс он работает так быстро, как только может, являясь чистой командной строкой без накладных расходов на графический интерфейс.