File.Copy() 从网络共享到同一台机器上的另一个共享是不是通过网络复制文件?

Posted

技术标签:

【中文标题】File.Copy() 从网络共享到同一台机器上的另一个共享是不是通过网络复制文件?【英文标题】:Does File.Copy() from a network share to another share on the same machine copy the file over the network?File.Copy() 从网络共享到同一台机器上的另一个共享是否通过网络复制文件? 【发布时间】:2010-10-08 00:10:47 【问题描述】:

如果我的 .NET 客户端使用 System.IO.File.Copy 将文件从 \server1\share1\file1.txt 复制到 \sever1\ share2\file2.txt,文件的数据会被读取到客户端,然后再写回服务器吗?如果是,.NET 客户端是否可以将服务器上的文件复制到同一服务器上的另一个位置,而无需往返文件?如果目标共享与源共享相同,是否会有所不同?

【问题讨论】:

【参考方案1】:

是的。我可以根据在机器之间复制 10 GB Zip 文件的个人经验来这么说。 “客户端”机器与其他两台机器位于美国的不同海岸。在两台机器之间直接从其中一台机器上花费了相当长的时间。尝试从另一个海岸的机器上启动副本花了大约 10 个小时:(

【讨论】:

【参考方案2】:

这是一个老问题,但我认为这里没有正确答案。

实际上有 2 个问题(3 个问题,但第 3 个问题是多余的)。

第一个问题是,如果在(第 3 台)客户端计算机上运行的 .Net 进程将文件从一个网络共享复制到另一个网络共享,如果源共享和目标共享在同一台计算机上(不同来自客户端)与 2 台不同的计算机?答案显然不是。网络共享之间没有机制,也没有秘密隧道。数据必须先传输到客户端,然后再传输到另一个共享。如果操作是复制或移动,则没有区别,如果共享与客户端位于同一台计算机上,则实际上没有区别(并且您确实使用 UNC 路径作为网络共享访问文件夹,而不是作为本地文件夹)。

第二个问题是,如何避免这种往返?以下是一些建议:

    如果源和目标在同一个共享上,则移动文件不需要往返,因为操作系统只更新文件系统中的引用。 在具有源共享或目标共享的计算机上运行的进程可以执行复制,而无需往返客户端。如果任一主机运行 Linux,则此过程可以是远程复制等。在 Windows 主机上,您可以安装 WCF 服务,该服务会在客户端收到请求时复制文件。

【讨论】:

【参考方案3】:

文件内容必须通过执行复制操作的机器。解决此问题的唯一方法是在目标机器上运行程序,这些程序在中间没有客户端机器的情况下执行传输。例如FXP,它使用 FTP 将服务器传输到服务器。 但是,打开此路径也可能会打开安全漏洞,我怀疑许多管理员会不愿意允许这样做。

【讨论】:

【参考方案4】:

这是一个很好的问题 - 我似乎找不到任何明确的答案,所以也许最好的办法是启动 Wireshark 进行测试。

【讨论】:

那为什么不投票赞成他的问题呢?也许你有,但它又被否决了,但似乎很多人忘记为好问题投票。 感谢您的 +1 并感谢您提供有关该工具的提示。我将使用该工具的输出更新我的问题,作为接受的“是”答案的证明,一旦我开始使用它。【参考方案5】:

如果可以进行移动而不是复制,那应该立即发生。否则你需要在目标机器上放一个服务,这样你才能远程调用它。

【讨论】:

我不确定您在这里所说的“证明”是什么意思。我只是在 Windows Vista 中向自己演示了它。试一试。使用机器 A 上的资源管理器访问机器 B 上的共享,然后“剪切”一个大子文件夹并将其“粘贴”到同一共享下的其他位置。它会立即移动。 正如@cdonner 所解释的,这仅在两个文件夹位于同一共享上时才有效。如果有两个不同的共享,移动将作为复制 + 删除执行,包括到客户端的往返。

以上是关于File.Copy() 从网络共享到同一台机器上的另一个共享是不是通过网络复制文件?的主要内容,如果未能解决你的问题,请参考以下文章

File.Copy 与手动 FileStream.Write 用于复制文件

如何在opensuse中的同一台机器上的VM和docker之间共享目录?

无法从同一网络上的另一台计算机连接到 Grapevine

如何在同一台机器上的不同网络接口上添加相同的端口?

通过网络将数据从主机上的一个线程发送到另一台机器上运行的某种服务线程

Unix编程-socket