2

我的主要问题是:如何在用户能够在中间取消它们的情况下进行文件操作。

我知道我可以使用这样的Microsoft.VisualBasic.FileIO命名空间:FileSystem.DeleteFile(...)但这只给了我一个文件的选项。我想一起删除许多文件。(复制也是如此……)

注意:即使在复制大文件的过程中,我也需要用户能够在需要时取消操作,而不仅仅是在文件之间。我知道我可以使用非托管代码 (- CopyFileEx) 做到这一点,但我正在寻找一种托管方式来做到这一点,无论它是否使用本机 Windows 对话框。

编辑:有人建议我为非托管代码使用“包装器”和“手动”复制和删除(在下面的答案中)。是否有我缺少的内置方式(如 VisualBasic 命名空间的东西 - 但对于多个文件)?

4

2 回答 2

2

我知道,就复制方法而言,您可以执行类似的操作,并且使用 Microsoft.VisualBasic 命名空间不会损害您的代码,请查看此链接中的文章

IFileOperation shell 接口,从 Vista 开始可用。此杂志文章中提供了此 COM 接口的托管类包装器。

如果还需要在早期版本的 Windows 上运行,请使用现有代码。

复制带有进度和取消选项的文件

于 2012-09-20T17:14:08.650 回答
1

在复制方面,您需要通过以块的形式复制文件来手动执行此操作,并且每次处理块时,您都会检查用户是否设置了取消标志。

void CopyStream(Stream in, Stream out) 
{ 
    var buf = new byte[512]; 

    int bytesRead; 
    while((bytesRead = in.Read(buf, 0, buf.Length)) > 0) 
    { 
        out.Write(buf, 0, bytesRead); 
        if(cancelled)
        { 
           // Do you cancel routine
           return; 
        } 
    } 
} 

对于删除,最好的办法是一次处理文件删除一个,并执行我上面描述的相同类型的过程。

这样做的好处是无论操作系统如何,它都可以工作。无论文件类型如何,它都可以工作。无论您正在实现什么线程,它都会起作用。

于 2012-09-20T17:15:43.703 回答