Перемещение и копирование удаленных файлов

Мне нужно сделать резервную копию файла, расположенного на удаленной машине, с помощью С#.

Например: "\server1\docs\test.txt" необходимо скопировать или переместить в "\server1\docs\backup\test.txt".

Вопрос: Когда я использую File.Copy, перемещает ли это файл с сервера на мою машину и обратно на сервер, т. е., по сути, выполняет круговой обмен файлом по сети?

Я хотел бы избежать кругового путешествия.

Детали: Обе машины являются ОС Windows в одном и том же домене.

Примечание. Я хочу, чтобы вы, ребята, знали, что я искал ответ на этот вопрос повсюду, однако нашел противоречивые ответы. Я хотел бы знать окончательно. Спасибо за ваше время.


person Josh    schedule 30.08.2016    source источник
comment
Возможный дубликат протокола SMB для копирования файлов между удаленными общими ресурсами   -  person Daniel Kravetz Malabud    schedule 30.08.2016


Ответы (2)


Вы должны запускать это с сервера, чтобы избежать передачи данных туда и обратно. Имейте в виду, что если файлы, с которыми вы пытаетесь работать, расположены на одном жестком диске, их перемещение будет быстрее, чем их копирование.

person Daniel Kravetz Malabud    schedule 30.08.2016
comment
Моя ситуация не позволяет мне добавлять какие-либо процессы на удаленный сервер. Что произойдет, если я просто переименую удаленный файл? Помешает ли это поездке туда и обратно? - person Josh; 30.08.2016
comment
Разве вы не можете использовать инструменты powershell или ps для входа на удаленный компьютер и выдачи копии оттуда? - person user1845593; 30.08.2016
comment
Я не вижу, как это может иметь какое-либо значение. Вы используете клиент для копирования файла, это означает, что сервер должен сначала отправить байты клиенту, а в вашем случае клиент только отправляет их обратно в другую папку. Если вы не можете запустить копию на той же машине (даже файл .bat будет хорош для такой работы), вы застряли с круговыми обходами. - person Daniel Kravetz Malabud; 30.08.2016
comment
@user1845593 user1845593 пользователи, запускающие мою программу, будут иметь доступ только для чтения и записи к этому одному общему ресурсу. - person Josh; 30.08.2016
comment
@ Av4t4r Av4t4r Если простое переименование файла требует обхода всего файла туда и обратно, это безумие. Я надеюсь, что SMB умнее этого. - person Josh; 30.08.2016
comment
@JoshuaR это не так, это поездка в один конец. Однако переименование файлов никак не поможет их перемещению или копированию. - person Daniel Kravetz Malabud; 30.08.2016
comment
Есть еще один пост, в котором утверждается, что переименование файла или изменение каталога на самом деле является одним и тем же процессом. Предполагая, что он прав, мне любопытно, вызовет ли перемещение файла туда и обратно. Я думаю, что единственный способ узнать наверняка - использовать сетевой монитор. - person Josh; 30.08.2016
comment
Я не уверен, где кто-то получил эту информацию, это неправильно. - person Daniel Kravetz Malabud; 30.08.2016
comment
@ Av4t4r Geesh, кажется, об этом много дезинформации. Если переименование файла не вызывает циклического обхода, возможно, было бы более эффективно просто переименовать файл из test.txt в test_backup.txt. Это помогло бы? - person Josh; 30.08.2016
comment
Переименование файла не является оптимальным, но это лучше, чем дважды перемещать файл размером около 1 ГБ по сети. - person Josh; 30.08.2016
comment
Конечно. Но это все тот же файл по тому же пути, который не является частью вашего первоначального вопроса. В вашем вопросе четко указано, что вы намереваетесь переместить содержимое папки в другую. Переименование файла не приводит к такому же результату. Это может быть достаточно хорошо для вашего случая, и это было бы здорово. - person Daniel Kravetz Malabud; 30.08.2016

Просто просмотрев исходный код C# (http://referencesource.microsoft.com/#mscorlib/system/io/file.cs,4a0905e7dc32d77d) кажется, что File.Copy вызывает функцию Win32Native.CopyFile. Честно говоря, я точно не знаю, что он делает, я имею в виду, что я никогда не видел код, но я думаю, что в этом нет никакой магии, и он считывает байты с удаленного компьютера и записывает на другой удаленный компьютер.

Изменить

Один из вариантов — войти на удаленный сервер через powershell (вы можете вызывать сценарии ps через C#) и выполнить команду для копирования на второй компьютер.

person user1845593    schedule 30.08.2016
comment
Я сам был удивлен, что не так много документации о фактическом процессе копирования, перемещения и переименования файлов с удаленной машины. Я нашел несколько решений по переполнению стека, но ответы различаются. - person Josh; 30.08.2016
comment
То, что именно делает собственная копия файла win32, зависит от множества факторов. По используемой версии windows (с обеих сторон), по типу доступа к сети (SMB/NFS/...)... однозначного ответа дать не получится. - person Gerald Schneider; 30.08.2016