2010-06-14 183 views
3

我有一個後臺工作人員正在運行復制一個巨大的文件(幾GB),我想知道如何取消複製過程中。我可以在複製之前檢查CancellationPending屬性,但在拷貝已經進行時不知道如何去做。取消長時間運行

if (worker.CancellationPending) // check cancellation before copy 
{ 
    e.Cancel = true; 
} 
else 
{  
    File.Copy("sourceFile", "destinationFile"); // need to cancel this 
} 

請指教,謝謝!

回答

6

我不確定,但我認爲File.Copy已備份由不支持該功能的winapi的CopyFile功能。

您應該指向CopyFileEx,該文件允許在文件的一部分被複制時使用回調方法。

+0

行 - 將嘗試CopyFileEx,thx。 – Eddie 2010-06-14 14:31:51

0

據我所知,後臺工作人員最適合進行大量小操作。我知道這很麻煩,但你可能想要考慮爲你的複製操作創建一個單獨的線程。這樣,如果你正在複製,你可以殺死線程。 (我不確定這會對複製造成什麼影響,但 - 我不知道是否會使用此方法留下臨時文件。)

+1

在這種情況下,殺死線程可能無效。請參閱MSDN上的[Thread.Abort()](http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx):'如果在執行非託管代碼時在託管線程上調用Abort,則ThreadAbortException在線程返回到託管代碼之前不會拋出。「#: – Humberto 2010-06-14 14:04:24

+0

如果你知道Windows資源管理器是以這種方式實現的,你會覺得節省嗎? ...我也不。 – 2010-06-14 14:04:38

+0

@Frank:有趣的事實... – Eddie 2010-06-14 14:32:41

0

複製文件中的塊。在塊之間,檢查操作是否已被取消。

這聽起來像是一個輪子重新發明,但如果你不想dllimport CopyFileEx,它是一個選項。

0

除了使用File.Copy或任何其他複製功能外,您還可以自己複製文件(從源流讀取數據,寫入目標數據流)。在複製所有塊的循環中,您可以檢查是否中止操作,然後執行必要的操作來中止複製過程。