在文件搜索中使用进度条

时间:2009-11-05 04:57:03

标签: java

我正在编写一个应用程序,它将从相应的路径中搜索特定的文件。在搜索过程中,我需要部署一个必须根据搜索运行的进度条。那我该怎么做呢?如果可能请发布代码?

5 个答案:

答案 0 :(得分:9)

这是一个棘手的问题。我不记得看到任何非索引搜索的实例显示进度条。 (任何人都可以证明我错了吗?)

我建议采用以下方法(Benny Hallett建议的延伸),这可能会提供更多的颗粒感。

假设您在整个文件系统中搜索特定的文件名模式(例如在unix中搜索/上的所有* .jpg文件)

首先将进度条分为N个部分(其中N是搜索根路径中的目录数)。

每次深入到目录heirachy时,分配给父目录的总进程条长度将根据其包含的子目录数进行划分。完成目录搜索后,分配给它的部分将添加到进度条。有关更多详细信息,您可以进一步将分配除以当前目录中的文件数+目录数。

此方法应确保您只需遍历目录结构一次,它应该更好地处理不均匀的目录。 (不均匀我指的是具有高和低搜索成本的目录混合)

作为一个例子,让我们假设一个像这样的目录结构:

/
    clipart
    photos
        family    
        holiday
    wallpapers
        anime
        landscapes

(每个缩进表示目录树中更深层次,让我们假设所有目录遍历都按字母顺序完成)

您首先查看'/'并看到有三个目录(剪贴画照片壁纸),因此您最初将进度条划分为三分之一。

然后搜索剪贴画目录,完成后,将进度条更新为三分之一。然后进入 photos ,看看有两个子目录。这意味着当您完成搜索 family 时,您会在进度条中添加六分之一,因为有两个子目录( family holiday )并且针对每一个的进展构成了分配给照片的三分之一

总结如下:

完成剪贴画增加了三分之一

完成照片/家庭增加了六分之一

完成照片/假期增加六分之一

完成壁纸/动漫增加了六分之一

完成壁纸/风景增加了六分之一

总计1.0(或100%)(忽略浮点精度)

答案 1 :(得分:4)

要使用大多数进度条控件,您需要知道两件事。

  • 你需要做多少事
  • 你做了多少事

对于第一个,使用目录中的文件数(对于单个目录)或子目录的数量(用于递归访问目录)可能是好的

其次,您希望每次处理文件或目录时都更新进度条。

有一个在Swing中使用Progress Bars的教程:here

您需要的基本代码是

JProgressBar progressBar = new JProgressBar(0, getNumberOfFiles());

然后使用

更新它
progressBar.setValue(getCurrentNumberProcessed());

如果文件或目录的初始数量未知,您可以致电 progressBar.setIndeterminate(true)创建其中一个我不知道这需要多长时间进度条。从那里,您可以计算出在执行

之前需要处理的文件或目录的数量
progressBar.setIndeterminate(false);
progressBar.setMaximum(numberOfFiles);

答案 2 :(得分:1)

您的搜索程序(SearchFile类 - 最好是单例)应该有一个字段,随着搜索的进行而更新。例如private double searchProgress;,然后在实际搜索期间更新此字段。

double searchProgress = 100/noOfTotalFiles;
searchProgress = searchProgress + searchProgressIncrement;

为您的搜索程序提供公共getter方法。

public double getProgress(){ return searchProgress;}

步骤2:     使用一个简单的线程来调用程序,每秒(根据需要)轮询进度。

progressBar.setIndeterminate(false);            
progressBar.setMaximum(100);

Thread t = new Thread(){

   @override 
   public void run(){
      progressBar.setValue((int)SearchFile.getProgress());
   }

}

确保您有适当的逻辑来知道您定期运行此线程的时间。例如,在SearchFile中更新一个标记,表示搜索已完成。

while(SearchFile.isRunning()){
       Thread.sleep(1000); //sleep for 1 sec
       progressBar.setValue((int)SearchFile.getProgress());
}

你仍然可以改善这个......

答案 3 :(得分:1)

我使用了Catchwa的方法。我将进度范围设置为14000,因为我系统上的操作系统有很多目录。当我找到一个空目录时,我将小数加权数量添加到进度条。数量基于深度并按范围标准化。在每个子树遍历中,你最终得到一个空的目录,并且dir中所有空子目录的权重包括dir的权重,但是分成块。当我找到一个非空目录时,我在地图中存储了子目录的数量。我得到了,使用Qt:

emit findProgressBar_setRange(14000);
...
if (dir.size()) {
    m_dirsAtDepth[++m_depth] = dir.size();
}
else {
    qreal product = 1.00;
    for (int i = 1; i <= m_depth; ++i) {
        product *= m_dirsAtDepth[i];
    }
    int x = qRound((1.00 / product) * 14000);
    emit findProgressBar_addValue(x);
}

它运行得非常顺畅而且价格便宜。我还为用户提供了一个准确的进度条选项,我首先计算了目标总数,这可能很昂贵。

答案 4 :(得分:0)

这种事情取决于几个因素。你是递归地寻找文件吗?你在寻找什么样的文件?你在寻找多种类型吗?您希望进度条如何根据搜索进度进行更新?

另外,你知道如何使用线程吗?这种问题很可能导致线程的使用(一个用于搜索文件,另一个用于更新进度条)。如果没有使用线程,那么你就有可能让你的UI“挂起”直到搜索完成。