Задержка в конце копирования через сеть

Я должен скопировать некоторые файлы размером 100 МБ в сети 1 ГБ, и скорость передачи хорошая, но в конце копирования для каждого файла задержка составляет около 5 секунд.

Я предполагаю, что это как-то связано с удаленным ПК, так как этого не происходит, если я копирую с одного локального диска на другой.

Я использую простую копию BlockRead/BlockWrite, поскольку она должна обрабатывать UNC, а также сопоставленные диски. Я не хочу, чтобы копия в потоке (API) была удаленной, это ноутбук или планшет, и когда пользователь увидит, что процесс выглядит как завершенный, он может отключиться и уйти до завершения потока.

Могу ли я что-то сделать с 5-секундной задержкой для каждого файла?

1 ответ

Копирование файлов по сети через общий доступ к файлам не работает так же, как жесткие диски на одном компьютере. Общий доступ к файлам Windows - сложная тема, которая имеет свой собственный совершенно другой способ работы. Любой файл, использующий любое программное обеспечение (включая сам Windows Explorer), подчиняется сетевым протоколам этого сетевого обмена файлами. Даже если вы скопируете файл напрямую через проводник Windows и увидите индикатор выполнения, вы заметите задержку в завершении копирования файла, когда индикатор выполнения достигнет 100%.

Ответ заключается в том, что нет способа избежать этой задержки при использовании общего доступа к файлам Windows. Все зависит от производительности каждого компьютера, их дисков, сетевой инфраструктуры, брандмауэров, антивирусов, процессоров и многого другого. Там нет никакой гарантии, что только потому, что это 100% полное копирование данных, что он готов к работе. После закрытия файла ваш компьютер может выполнять несколько различных процедур (в основном для обеспечения безопасности и проверки).

Как отмечали другие, по соображениям производительности лучше копировать большие файлы внутри потока, чтобы пользовательский интерфейс мог правильно реагировать на действия пользователя. Многопоточность не так проста, особенно при обновлении элементов управления VCL (например, индикатора выполнения), поэтому вы должны изучить, как это сделать в потоке.

Другие вопросы по тегам