【发布时间】:2016-10-18 11:19:57
【问题描述】:
我正在研究一种在同一台远程机器上复制大文件的有效解决方案,我们称之为 FILESERVER。然后,从另一台服务器(WEBSERVER)我想远程发布这些文件的副本,所以我尝试使用 Windows 资源管理器将文件复制/粘贴到同一个远程共享文件夹中,我注意到它不需要通过移动文件内容网络,所以我认为使用共享文件夹并简单地从 WEBSERVER 复制文件就可以了。
所以,我用下面的代码试了一下。
File.Copy("\\FILESERVER\FOLDER\bigfile", "\\FILESERVER\FOLDER2\bigfile");
这可行,但我注意到它实际上是通过网络移动文件内容,而这正是我想要避免的。我不想在 FILESERVER 中实现一个服务器来接收复制文件的命令,如果我可以使用内置的 Windows 机制来做到这一点。所以我想实现的行为与 Explorer 相同,从我的 c# 代码中调用它。那么,可以在 .NET 中执行此操作吗?
编辑: 我尝试了 XCOPY 命令,起初它似乎没有使用网络。 但是在重新启动以确保它不涉及任何操作系统缓存之后,我注意到当我从 cmd 执行 XCOPY 时,它不会在 Process Explorer/taskmgr 中显示任何 I/O,但是,当我从我的 C# 代码执行此命令时确实如此。所以我认为它确实使用网络来获取/写入文件内容,但出于一个奇怪的原因,这些诊断工具(taskmgr / Process Explorer)中没有报告它。
【问题讨论】:
-
这可能与老式的 shell 对象有关 - 请参阅 msdn.microsoft.com/en-us/library/windows/desktop/…(没有 C# 示例,但它可能会让您入门)。它具有不显示标准 Windows Explorer 复制对话框的标志,因此它似乎应该与 Windows Explorer 使用的 API 相同。
-
试试它是否适用于命令行中的 COPY 命令。如果是这样,请使用
proc = new ProcessStartInfo("cmd", "/c COPY \\FILESERVER\FOLDER\bigfile \\FILESERVER\FOLDER2\bigfile"); ... proc.Start();运行它 -
好吧,我必须再次尝试 XCOPY,但我注意到它也会通过网络移动内容。我确实评论说它有效,但我必须再试一次。