如何在同一台远程计算机中有效地复制UNC路径

时间:2016-10-18 11:19:57

标签: c# .net wmi unc

我正致力于在同一台远程计算机上复制大文件的高效解决方案,让我们称之为FILESERVER。然后,从另一台服务器(WEBSERVER)我想远程发布这些文件的副本,所以我尝试使用Windows资源管理器在同一个远程共享文件夹中复制/粘贴文件,我发现它不需要移动文件内容通过网络,所以我想使用共享文件夹,只需从WEBSERVER复制文件即可。

所以,我尝试使用以下代码。

File.Copy("\\FILESERVER\FOLDER\bigfile", "\\FILESERVER\FOLDER2\bigfile");

这有效,但我注意到它实际上是通过网络移动文件内容,而这正是我想要避免的。如果我可以使用内置的Windows机制,我不想在FILESERVER中实现服务器来接收复制文件的命令。所以我想要实现的行为与Explorer一样,从我的c#代码调用它。那么,有可能在.NET中做到这一点吗?

修改: 我尝试过XCOPY命令,起初它似乎没有使用网络。 但是在重新启动以确保它不涉及任何操作系统缓存之后,我注意到当我从cmd执行XCOPY时它不会在Process Explorer / taskmgr中显示任何I / O,但是,当我执行此命令时从它的C#代码来看。所以我认为它确实使用网络来获取/写入文件内容,但由于一个奇怪的原因,它们没有在这些诊断工具(taskmgr / Process Explorer)中报告。

2 个答案:

答案 0 :(得分:1)

使用PSEXEC并在远程计算机上运行带有本地文件夹路径的副本。

答案 1 :(得分:1)

绝对是WMI是一种很好的方法。我终于设法使用以下代码和CopyEx方法以递归方式复制目录。

var classInstance = new ManagementObject("\\\\FILESERVER\\root\\cimv2", "Win32_Directory.Name='c:\\path\\to\\directory1'", null);

var copyExInParams = classInstance.GetMethodParameters("CopyEx");

// Add the input parameters.
copyExInParams["FileName"] = "c:\\path\\to\\directory2";
copyExInParams["Recursive"] = true;
copyExInParams["StartFileName"] = null;

var copyExOutParams = classInstance.InvokeMethod("CopyEx", copyExInParams, null);

重要的是要注意路径必须是远程机器格式。我无法证明这一点,但也许Windows资源管理器利用WMI将文件复制到共享文件夹中的同一台远程计算机上,以防止无用的网络流量。我还没有办法直接与UNC一起做。即使这适合我的用例。