我正致力于在同一台远程计算机上复制大文件的高效解决方案,让我们称之为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)中报告。
答案 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一起做。即使这适合我的用例。