Does anyone know any way of implementing progress bar for Apache's FileUtils.copyDirectory(File src, File dst)
? I don't see anything helpful in JavaDocs and API. Seems like a common use case in dealing with batch disk operations, so I'm not sure if I miss something obvious.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
I guess you will have to do that yourself. I see this immediate solution:
- Find all files you are about to copy and count the number or total file size first (depending on what your progress bar should measure)
- Copy the files using
FileUtils.copyDirectory(File, File, FileFilter)
and "abuse" theFileFilter
as a callback to communicate progress to your progress bar
回答2:
For anyone interested, I did this by coping the doCopyFile
method from FileUtils and the couple of methods that lead up to it. I then pasted them into a new class so that I could edit the methods rather than only using the fixed FileUtils methods.
Then I changed this part of the doCopyFile
method:
pos += output.transferFrom(input, pos, count);
To this: (update the progress bar every time the buffer is emptied, not the best way)
//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));
For a better way the copy would be run in a different thread, and the progress bar would be updated in the EDT (using the bytesTransfered
value and the total size of the files that are being copied):
long bytesTransfered = output.transferFrom(input, pos, count);
pos += bytesTransfered;
bytesTransferedTotal += bytesTransfered;
Then to update the progress bar on the EDT fire events with something like this:
ProgressBar.setValue((int) Math.floor((100.0 / totalSizeOfFiles) * bytesTransferedTotal));