我的主要问题是:如何进行文件操作,用户可以在中间取消它们。
我知道我可以使用Microsoft.VisualBasic.FileIO
命名空间,例如:FileSystem.DeleteFile(...)
,但这只能为我提供一个文件的选项。我想一起删除很多文件。 (复制也是如此......)
注意:即使在复制大文件的过程中,我也需要用户能够取消操作,而不仅仅是在文件之间。我知道我可以使用非托管代码( - CopyFileEx
)来做到这一点,但我正在寻找一种托管方式来做到这一点,无论它是否使用本机Windows对话框。
编辑:我被建议用于非托管代码和“手动”复制和删除的'包装'(在下面的答案中)。是否有一种内置的方式(比如VisualBasic命名空间的东西 - 但是对于多个文件)我不知道?
答案 0 :(得分:2)
我知道一个复制方法,你可以做这样的事情并使用Microsoft.VisualBasic NameSpace不会伤害你的代码检查这个链接中的文章
IFileOperation shell界面,自Vista以来可用。此magazine article中提供了此COM接口的托管类包装器。
如果还需要在早期版本的Windows上运行,请使用现有代码。
答案 1 :(得分: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;
}
}
}
对于删除,您最好的办法是一次处理一个文件删除,并执行上述相同类型的处理。
这样做的好处是无论操作系统如何,它都能正常工作。无论文件类型如何,它都能正常工作。无论您正在实施哪种线程,它都能正常工作。