5

有谁知道为 Apache 实现进度条的任何方法FileUtils.copyDirectory(File src, File dst)?我在JavaDocs和 API 中看不到任何有用的东西。似乎是处理批处理磁盘操作的常见用例,所以我不确定我是否遗漏了一些明显的东西。

4

2 回答 2

6

我想你必须自己做。我看到了这个直接的解决方案:

  1. 找到您要复制的所有文件并首先计算文件数量或总文件大小(取决于您的进度条应该测量的内容)
  2. FileUtils.copyDirectory(File, File, FileFilter)使用并“滥用”FileFilter作为回调复制文件以将进度传达给进度条
于 2012-07-11T07:12:40.213 回答
3

对于任何感兴趣的人,我通过处理doCopyFileFileUtils 中的方法和导致它的几个方法来做到这一点。然后我将它们粘贴到一个新类中,以便我可以编辑这些方法,而不仅仅是使用固定的 FileUtils 方法。

然后我改变了这部分doCopyFile方法:

pos += output.transferFrom(input, pos, count);

为此:(每次清空缓冲区时更新进度条,不是最好的方法)

//Split into into deceleration and assignment to count bytes transfered
long bytesTransfered = output.transferFrom(input, pos, count);
//complete original method
pos += bytesTransfered;
//update total bytes copied, so it can be used to calculate progress
bytesTransferedTotal += bytesTransfered;
//your code to update progress bar here
ProgressBar.setValue((int) Math.floor((100.0 / totalSize) * bytesTransferedTotal));

为了更好的方式复制将在不同的线程中运行,并且进度条将在 EDT 中更新(使用bytesTransfered正在复制的文件的值和总大小):

long bytesTransfered = output.transferFrom(input, pos, count);
pos += bytesTransfered;
bytesTransferedTotal += bytesTransfered;

然后使用以下内容更新 EDT 触发事件的进度条:

ProgressBar.setValue((int) Math.floor((100.0 / totalSizeOfFiles) * bytesTransferedTotal));
于 2013-08-30T03:57:34.393 回答