Самый быстрый способ копирования файлов

15

При успешной сборке на нашем сервере сборки (CCNET) все файлы веб-сайта ASP.NET копируются в виртуальный каталог (% output_dir%), поэтому не разработчики могут видеть / тестировать последнюю версию веб-сайта. В конце сборки исполняется следующий bat-файл.

rmdir /s /q "%output_dir%"
mkdir "%output_dir%"
xcopy "%source_dir%*"  "%output_dir%" /e /c /i /q /-y

Проблема в том, что копирование происходит медленно, и мне было интересно, есть ли в Windows 2008 какие-либо команды копирования, которые работают быстрее, чем xcopy? Источник и пункт назначения находятся на одном диске. Ниже приведены аргументы, которые мы используем при копировании.

/e = copies directories and sub directories including empty ones.
/c = continues copying even if there are errors
/i = if destination does not exist destination is directory
/q = don't display filenames
/-y = confirm overwrite
dmcgiv
источник

Ответы:

21

Только с точки зрения производительности , xcopy или robocopy даст вам аналогичные результаты. Я провел несколько тестов на 64-битной машине с пакетом обновления 2 (SP2) для Windows Vista, чтобы провести некоторые сравнения. Все копии выполнялись между внутренним диском Sata II со скоростью вращения 7200 об / мин и внешним диском USB 2.0 или на том же самом внутреннем диске, где указано. Никаких специальных настроек не было сделано (примите решение, если это сделает тест недействительным / подтвердит правильность), только для ввода команды в командный файл для выполнения. PowerShell использовался для записи времени начала и окончания. После нескольких проходов вот средние значения инструментов, с которыми я играл:

Файл: 732 909 568 байт (698 МБ), 1 файл ISO скопирован в другой каталог на одном и том же внутреннем диске.

copy      6 secs (ex. copy G:\folder1\* G:\folder2\)
xcopy     6 secs (ex. xcopy G:\folder1 G:\folder2 /I /E /Y /R)
robocopy  6 secs (ex. robocopy G:\folder1\ G:\folder2 /E /NP)
teracopy 28 secs (ex. TeraCopy.exe Copy G:\folder1\ G:\folder2\)
fastcopy 19 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=G:\folder2)  

Файл: 732 909 568 байт (698 МБ), 1 файл ISO скопирован на внешний USB-диск.

copy     36 secs (ex. copy G:\folder1\* I:\folder2\)
xcopy    35 secs (ex. xcopy G:\folder1 I:\folder2 /I /E /Y /R)
robocopy 36 secs (ex. robocopy G:\folder1\ I:\folder2 /E /NP)
teracopy 36 secs (ex. TeraCopy.exe Copy G:\folder1\ I:\folder2\)
fastcopy 38 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=I:\folder2)  

Файлы: 45 039 616 байт (42,9 МБ). 5 случайных файлов, скопированных на внешний USB-диск.

copy      6 secs (ex. copy G:\folder1\* I:\folder2\)
xcopy     5 secs (ex. xcopy G:\folder1 I:\folder2 /I /E /Y /R)
robocopy  6 secs (ex. robocopy G:\folder1\ I:\folder2 /E /NP)
teracopy 12 secs (ex. TeraCopy.exe Copy G:\folder1\ I:\folder2\)
fastcopy  6 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=I:\folder2)

Файлы / каталоги: 1 087 180 800 байт (1,01 ГБ), 27 файлов / 8 каталогов, скопированных на внешний USB-диск.

copy     *Not included in test
xcopy    57 secs (ex. xcopy G:\folder1 I:\folder2 /I /E /Y /R)
robocopy 58 secs (ex. robocopy G:\folder1\ I:\folder2 /E /NP)
teracopy 56 secs (ex. TeraCopy.exe Copy G:\folder1\ I:\folder2\)
fastcopy 60 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=I:\folder2)

Это ни в коем случае не является исчерпывающим тестом, но просто бросить быстрый сценарий реального мира на некоторые из наиболее популярных инструментов этого жанра показывает, что вы довольно безопасно придерживаетесь либо xcopy, либо Robocopy (только с точки зрения производительности). Также опция Robocopy /NP(без прогресса) экономит 0 раз. Это не значит, что вы не сможете извлечь выгоду из использования чего-то другого, кроме xcopy. Robocopy - отличный пример (из Википедии ):

Robocopy отличается возможностями, выходящими за пределы встроенных
команд Windows copy и xcopy, включая следующие:

  • Способность выдерживать перебои в сети и возобновлять копирование с того места, где оно ранее было прервано (неполные файлы отмечены отметкой даты, соответствующей 1980-01-01, и содержат запись восстановления, поэтому Robocopy знает, где продолжить).
  • Способность правильно копировать атрибуты, информацию о владельце, альтернативные потоки данных, информацию аудита и временные метки по умолчанию без необходимости использования многочисленных часто забываемых ключей командной строки.
  • Способность правильно копировать списки ACL NTFS (при наличии / COPYALL) и отстаивать «право на резервное копирование» в Windows NT (/ B), чтобы администратор мог скопировать весь каталог, включая файлы, для которых администратору было отказано в чтении.
  • Постоянство по умолчанию, с программируемым числом автоматических попыток, если файл не может быть открыт.
  • «Зеркальный» режим, который поддерживает синхронизацию деревьев путем необязательного удаления из места назначения файлов, которых больше нет в источнике.
  • Возможность копирования большого количества файлов, которые в противном случае могли бы привести к сбою встроенной утилиты XCOPY.
  • Индикатор выполнения в командной строке, который постоянно обновляется.
  • Возможность копирования длинных имен файлов и папок, превышающих 256 символов - до теоретических 32 000 символов - без ошибок.
Shaun Hess
источник
5

Я обычно использую:

robocopy source dest /E /MIR

или какой-то другой вариант параметров - возможно, /NFL /NDL /NS /NC /NPдля соответствия «тихий»

Марк Гравелл
источник
да, / NP является обязательным условием для быстрой робокопии
Ivo Looser
когда вы снова и снова создаете тот же контент, что и в источнике, я должен использовать / MIR или / PURGE из команды Robocopy.
Иво Лузер
1

Фактически, исключив Сеть, вы действительно ограничили свое тестирование. Вы можете рассмотреть возможность использования общего сетевого ресурса, который будет основной работой администратора.

Кроме того, вы должны использовать FTP и вообще пропустить CIFS. Eseutil.exe - еще одна утилита, которую вы можете добавить туда. (Утилита Exchange, которую можно использовать в другом месте, вместе с четырьмя зависимыми библиотеками.)

Тогда я хотел бы увидеть ваши результаты.

Len
источник
1

Я использую XCopy для той же цели. Я также добавил еще один сетевой адаптер к этому серверу и поместил его в отдельную подсеть. Затем установил прямое соединение с сервером, с которого я передаю файлы. Таким образом, 2 машины перемещают скопированные данные через одну подсеть, и пользователи могут получить доступ через второй блок, который напрямую подключен к локальной сети.

Саиф Хан
источник
1

Вы говорите, что источник и место назначения находятся на одном диске, но они оба на сервере сборки?

Если сервер сборки является местом расположения источника и места назначения, рассмотрите возможность перемещения одной или другой папки на другой диск, возможно, на другой контроллер.

Если сервер сборки не является местоположением источника и места назначения (выпадающие сборки не всегда находятся на сервере, на котором они построены), рассмотрите возможность создания задачи на сервере, где находятся папки источника и места назначения. Тогда просто начните эту задачу удаленно.

Дональд Берд
источник
1

Мне пришлось сделать несколько копий за эти годы. У нас есть один компьютер под управлением Windows Server 2008 R2, в котором есть один каталог с более чем 12M образами (приблизительно 400 ГБ).

Очевидно, я бы предпочел, чтобы это был не такой большой каталог, НО:

  • XCOPY обрабатывает копию большой папки, но вылетает при попытке перейти из большой папки.
  • ROBOCOPY обрабатывает копию без проблем и является гораздо более приятным опытом при копировании, поскольку она предлагает лучшие показатели прогресса.
  • XCOPY на небольших каталогах быстрее.

В любом случае, я просто подумала, что поделюсь с ними своим опытом из-за необычного характера моего действительно большого каталога.

Уилл Заблоки
источник