Копирует ли файл по сети File.Copy() из общего сетевого ресурса в другой общий ресурс на том же компьютере?
Если мой клиент.NET использует System.IO.File.Copy для копирования файла из \server1\share1\file1.txt в \ sever1 \ share2 \ file2.txt, данные файла считываются клиенту и затем записываются обратно до сервера? Если да, есть ли способ.NET-клиент может скопировать файл на сервере в другое место на том же сервере, не обращая внимание на файл? Имеет ли значение, если целевой ресурс такой же, как исходный ресурс?
5 ответов
Да, это так. Я могу сказать это по личному опыту копирования 10 ГБ Zip-файлов между компьютерами. "Клиентская" машина находилась на другом побережье Америки, чем две другие машины. Между двумя машинами напрямую с одной из них ушло разумное количество времени. Попытка инициации копирования с машины на другом берегу заняла ~10 часов:(
Это старый вопрос, но я не думаю, что здесь есть правильный ответ.
На самом деле есть 2 вопроса (3 вопроса, но третий является излишним).
Первый вопрос: если процесс.Net, запущенный на (3-м) клиентском компьютере, копирует файл из одного сетевого ресурса в другой сетевой ресурс, имеет ли это значение, если исходный и целевой ресурсы находятся на одном компьютере (отличается от клиента) против 2 разных компьютеров? Ответ явно нет. Нет механизма, нет секретного туннеля между сетевыми ресурсами. Данные должны перемещаться к клиенту, а затем к другому ресурсу. Это не имеет значения, если операция является копией или перемещением, и на самом деле не имеет значения, если общие папки находятся на том же компьютере, что и клиент (и вы действительно получаете доступ к папкам как общие сетевые ресурсы с путем UNC, а не как локальные папки).
Второй вопрос: как избежать этого кругового путешествия? Вот некоторые предложения:
- Если источник и цель находятся в одном и том же общем ресурсе, перемещение файла не требует обратной передачи, поскольку ОС обновляет только ссылки в файловой системе.
- Процесс, запущенный на компьютере с исходным или целевым общим ресурсом, может выполнить копирование без обращения к клиенту. Этот процесс может быть удаленной копией и т.д., если любой из хостов работает под управлением Linux. На хосте Windows вы можете установить службу WCF, которая копирует файлы при поступлении запроса от клиента.
Содержимое файла должно пройти через аппарат, выполняющий операцию копирования. Единственный способ обойти это - запускать программы на целевых компьютерах, которые выполняют передачу без клиентского компьютера в середине. такой как FXP, который использует FTP для передачи сервера на сервер.
Однако открытие этого пути может также открыть лазейку в безопасности, и я подозреваю, что многие администраторы неохотно позволят это сделать.
Это отличный вопрос - я не могу найти однозначного ответа, так что, возможно, лучше всего было бы запустить Wireshark для теста.
Если возможно сделать ход вместо копии, это должно произойти мгновенно. В противном случае вам нужно разместить службу на целевом компьютере, чтобы вы могли вызывать ее удаленно.