2016-10-18 75 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合作的方法。儘管這適合我的用例。

相關問題