簡體   English   中英

如何在同一台遠程計算機中有效地復制UNC路徑

[英]How to copy efficiently UNC paths in the same remote machine

我正在研究一種有效的解決方案來復制同一個遠程機器中的大文件,我們稱之為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)中報告。

使用PSEXEC並在遠程計算機上使用本地文件夾路徑運行副本。

絕對是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一起做。 即使這適合我的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM