我有一个简单的文件访问者类,它扫描PC内的所有驱动器来查找特定的扩展名,如.txt。我想用一个JProgressBar来显示这个操作的进度。每次扫描时,匹配的文件总数可能会发生变化。这使我无法计算要在JProgressBar上显示的进程的百分比。
我的代码是基于这个的:Recursive Pattern Matching
当文件总数不断变化时,如何计算和显示百分比?
发布于 2014-04-07 17:20:27
问题是,你事先不知道你有多少个文件。一般来说,您可以选择在文件系统中运行两次:第一次,您只需输入目录,并且只计算所有文件。
根据这个数字,您可以在第二次运行时计算百分比,在第二次运行时,您可以查看文件本身。
这显然延长了这个过程,而且您在第一次扫描时也没有进展。
您可以做的是,在不同的线程中开始第一次扫描。假设您的模式匹配需要更多的时间,而不仅仅是计数文件,计数将会更快,并且您可以动态调整JProgressBar。然后,它将开始不可靠,并随着时间的推移变得更加准确。
我猜这个方法类似于在windows复制机制中实现的方法。它们还会先扫描没有进度信息的文件,然后再开始复制进度信息。然而,这可能会导致你可能从windows机器上知道的效果--在windows机器上,文件操作有像"2小时剩余“这样的信息,并且在2分钟后突然完成,反之亦然。
编辑:
对不起,我刚刚注意到你想遍历硬盘上的所有文件,而不是从某个点开始。
您可以将您已经看到的文件大小相加,如果您知道可用磁盘空间和总磁盘空间,则可以计算已经完成的百分比。然而,进展很可能不会一帆风顺,因为文件大小往往非常不同。
发布于 2014-04-07 17:25:43
使用此example,在background中执行主机操作系统的find命令,并在图形用户界面中显示结果。因为事先不知道文件的数量,所以程序调用进度条上的setIndeterminate(true)。以下是一些典型的命令行:
ProcessBuilder pb = new ProcessBuilder("find", ".", "-name", "*.txt");
ProcessBuilder pb = new ProcessBuilder("dir", "/s", "*.txt");

https://stackoverflow.com/questions/22907653
复制相似问题