2016-10-18 38 views
3

我正在研究一个在同一个远程机器上复制大文件的高效解决方案,我们称之为FILESERVER。然后,从另一台服务器(WEBSERVER)我想远程发布这些文件的副本,所以我试图使用Windows资源管理器将文件复制/粘贴到同一个远程共享文件夹中,并且我注意到它不需要通过网络,所以我认为使用共享文件夹,并简单地从WEBSERVER复制文件可以做到这一点。如何在同一个远程机器上有效地复制UNC路径

所以,我试了一下下面的代码。

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)未报告它。

+0

它可能可以处理旧的shell对象 - 请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx(theren 'C#示例,但它可能会让你开始)。它具有不显示标准Windows资源管理器副本对话框的标志,因此它看起来应该与Windows资源管理器使用的API相同。 –

+1

尝试使用命令行中的COPY命令。如果是这样,使用'proc = new ProcessStartInfo(“cmd”,“/ c COPY \\ FILESERVER \ FOLDER \ bigfile \\ FILESERVER \ FOLDER2 \ bigfile”)运行它; ... proc.Start();' – Codo

+0

那么我必须再次尝试XCOPY,但我注意到它也通过网络移动内容。我做了评论,说它工作,但我不得不再次尝试。 – jorgonor

回答

1

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

+0

这似乎是一个很好的方法,PSEXEC是自治的,并自动将服务安装在其他机器上。但是,我宁愿从没有任何外部实用工具的代码中做到这一点。如果存在,我希望有人知道一个API来做这件事。 – jorgonor

+0

当您在本地运行它时,它只会在本地。从另一台机器始终使用网络,因为命令必须“管理”数据。 – Dexion

+0

起初我以为是同样的事情,但我已将文件复制到同一个共享文件夹中,并且taskmgr显示的网络活动很少。这就像它使用某种“API”,让Windows知道可以在远程硬盘上完成复制。 – jorgonor

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合作的方法。尽管这适合我的用例。

相关问题