一尘不染

我可以在.NET中使用FileInfo.CopyTo()显示文件复制进度吗?

c#

我已经在c#(.NET 2.0
Framework)中创建了一个复制实用程序,用于复制文件,目录和递归子目录等。该程序具有一个GUI,该GUI显示正在复制的当前文件,当前文件号(序列),总数复制文件的数量以及完成复制操作的百分比。还有一个进度条,基于当前文件/总文件数。

我的问题与复制大文件有关。我一直找不到一种方法来指示大文件的总复制进度(使用我当前使用FileInfo.CopyTo方法的类结构)。作为一种解决方法,我将文件复制操作和GUI显示分离到了各自的线程中,并设置了直观的提示以表明工作已完成。至少用户知道该程序未冻结,并且仍在复制文件。

能够根据字节总数显示进度,或者具有从FileInfo.CopyTo方法触发的某种类型的事件,该事件指示从当前文件复制的字节总数,会更好。

我知道FileInfo.Length属性,因此我确定MacGuyver有一种基于此的事件,并且在GUI端有一个处理程序可以读取更新(也许基于检查FileInfo)。目标对象的Length属性是否使用某种类型的计时器?)。

有人知道我忽略的方法吗?如果可以避免的话,我不希望重写类来通过流复制字节并以这种方式进行跟踪(尽管我认为我可能会坚持走这种路线)。

提前致谢

PS-我目前仍停留在.NET 2.0框架中,因此,仅要求> = 3.0中可用功能的任何解决方案都不适合我。

PPS-我愿意接受任何.NET语言版本的解决方案,而不仅仅是c#。


阅读 481

收藏
2020-05-19

共1个答案

一尘不染

FileInfo.CopyTo基本上是kernel32.dll中Win32 API调用“ CopyFile”的包装。此方法不支持进度回调。

但是,CopyFileEx方法可以,并且您可以在几分钟内围绕它编写自己的.NET包装器,如此处所述:http
:
//www.pinvoke.net/default.aspx/kernel32.CopyFileEx

2020-05-19