拷贝文件的彩色进度条

系统默认的 io.copy
代码
语言自带的 io.Copy 可以完成拷贝,但是不能提供进度条,所以我们要自己解决问题
带进度条的代码
代码
在 langgo 框架里我实现了一个 helper_os.CopyFileWatcher 方法,允许传入一个 helper_os.IOProgressListener 实例,当发生文件copy的时候会通过 ProgressChanged 回调进度
func CopyFileWatcher(dst string, src string, buf []byte, listener IOProgressListener) (written int64, err error)
dst - 目标文件
src - 原始文件
buf - 可以传 buf = nil 这时候内部会默认分配一个32K的 buf 实际上 io.Copy 内部也是32K,如果传入自定义buf会根据指定的大小来完成一次拷贝,但对于执行效率,没有决定性的影响,仅仅是影响回调的频率
listener - 需要自己实现一个 listener 用来回调进度
跑起来就是屏首的那个 GIF 动图的效果
实现
langgo 框架下的 CopyFileWatcher 代码
代码 52-85 - 基本上是来自 io.copyBuffer 的源代码平移过来的,所以性能和表现是一样的,反复读反复写入,写入成功的时候回调进度
代码 3-19 - 当退出的时候根据 是否存在 err 来返回 TransferCompletedEvent 或者 TransferFailedEvent
代码 78-84 每次写入成功的时候推送进度条
代码 21-24 这个和 io.copyBuffer 是一致的 当 buf = nil 会自动创建一个 32 * 1024 的 buf 来提供读写缓存,提升 buf 大小只是影响 回调的频率,但对于花费的时间 影响不大
代码和视频
最后更新于