2010-06-14 148 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或任何其他复制功能外,您还可以自己复制文件(从源流读取数据,写入目标数据流)。在复制所有块的循环中,您可以检查是否中止操作,然后执行必要的操作来中止复制过程。