概要

指定したDirectory以下のFileを再帰的に検索し、その進捗状況をJProgressBarで表示します。

サンプルコード

private void recursiveSearch(File dir, final List<File> list)
        throws InterruptedException {
  for (String fname : dir.list()) {
    if (Thread.interrupted()) {
      throw new InterruptedException();
    }
    File sdir = new File(dir, fname);
    if (sdir.isDirectory()) {
      recursiveSearch(sdir, list);
    } else {
      scount++;
      if (scount % 100 == 0) {
        publish(new Message("Results:" + scount + "\n", false));
      }
      list.add(sdir);
    }
  }
}
view all

解説

上記のサンプルでは、選択したフォルダ以下のファイルを再帰的にすべて検索して表示しています。JProgressBarを使った進捗状況の表示とキャンセルには、SwingWorkerを利用しています。


JDK 1.7.0以上の場合は、Files.walkFileTree(...)などを使用する方法もあります。

private void recursiveSearch(Path dir, final ArrayList<Path> list) throws IOException {
  Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
    @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
      if (Thread.interrupted()) {
        throw new IOException();
      }
      if (attrs.isRegularFile()) {
        list.add(file);
      }
      return FileVisitResult.CONTINUE;
    }
  });
}

JDK 1.8.0以上の場合は、Files.walk(Path)を使用する方法もあります。

import java.util.*;
import java.util.stream.*;
import java.io.IOException;
import java.nio.file.*;
public class FilesWalkTest {
  public static void main(String[] args) {
    Path dir = Paths.get(".");
    //Files.walk(dir).forEach(System.out::println);
    try (Stream<Path> s = Files.walk(dir)
                               .filter(Files::isRegularFile)) {
      List<Path> l = s.collect(Collectors.toList());
      System.out.println(l.size());
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

参考リンク

コメント

  • 実際に動作するサンプルを追加してみました。 -- aterai
  • JDK 6SwingWorkerを使用するように変更しました。 -- aterai