• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Fileの再帰的検索
#navi(../)
#tags(File, JProgressBar, SwingWorker)
RIGHT:Posted by &author(aterai); at 2003-12-15
* Fileの再帰的検索 [#la10adfb]
ファイルを再帰的に検索します。
---
category: swing
folder: RecursiveFileSearch
title: Fileの再帰的検索
tags: [File, JProgressBar, SwingWorker]
author: aterai
pubdate: 2003-12-15
description: 指定したDirectory以下のFileを再帰的に検索し、その進捗状況をJProgressBarで表示します。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTRh7du1II/AAAAAAAAAhU/jcMUoOTcbTU/s800/RecursiveFileSearch.png
---
* 概要 [#summary]
指定した`Directory`以下の`File`を再帰的に検索し、その進捗状況を`JProgressBar`で表示します。

//- &jnlp;
- &jar;
- &zip;
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTRh7du1II/AAAAAAAAAhU/jcMUoOTcbTU/s800/RecursiveFileSearch.png)

#ref(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTRh7du1II/AAAAAAAAAhU/jcMUoOTcbTU/s800/RecursiveFileSearch.png)

** サンプルコード [#n78bba98]
* サンプルコード [#sourcecode]
#code(link){{
public void recursiveSearch(File dir, final Vector list)
    throws InterruptedException {
  String[] contents = dir.list();
  for(int i=0;i<contents.length;i++) {
    if(Thread.interrupted()) {
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, contents[i]);
    if(sdir.isDirectory()) {
    File sdir = new File(dir, fname);
    if (sdir.isDirectory()) {
      recursiveSearch(sdir, list);
    }else if(isGraphicsFile(sdir.getName())) {
    } else {
      scount++;
      if (scount % 100 == 0) {
        publish(new Message("Results:" + scount + "\n", false));
      }
      list.add(sdir);
    }
  }
}
}}

** 解説 [#l9b71aa9]
上記のサンプルでは、選択したフォルダ以下のファイルを再帰的にすべて検索して表示するようになっています。
* 解説 [#explanation]
上記のサンプルでは、選択したフォルダ以下のファイルを再帰的にすべて検索して表示しています。`JProgressBar`を使った進捗状況の表示とキャンセルには`SwingWorker`を利用しています。

----
``JProgressBar``を使った進捗状況の表示とキャンセルには、``SwingWorker``を利用しています。
- `JDK 1.7.0`以上の場合は`Files.walkFileTree(...)`を使用する方法もある
-- [https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#walkFileTree-java.nio.file.Path-java.nio.file.FileVisitor- Files#walkFileTree(...) (Java Platform SE 8)]
-- [https://docs.oracle.com/javase/tutorial/essential/io/walk.html Walking the File Tree (The Java™ Tutorials > Essential Classes > Basic I/O)]

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

- [http://docs.oracle.com/javase/tutorial/essential/io/walk.html Walking the File Tree (The Java™ Tutorials > Essential Classes > Basic I/O)]
- [http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path,%20java.nio.file.FileVisitor) Files (Java Platform SE 7 )]

#code{{
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()) {
      if (Thread.interrupted()) {
        throw new IOException();
      }
      if(attrs.isRegularFile()) {
      if (attrs.isRegularFile()) {
        list.add(file);
      }
      return FileVisitResult.CONTINUE;
    }
  });
}
}}

** 参考リンク [#oc687cdf]
----
- `JDK 1.8.0`以上の場合は`Files.walk(Path)`を使用する方法もある
-- [https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#walk-java.nio.file.Path-java.nio.file.FileVisitOption...- Files#walk(Path) (Java Platform SE 8)]
-- [https://www.ne.jp/asahi/hishidama/home/tech/java/files.html#walk Javaファイル関連メモ2(Hishidama's Java Files Memo)]
-- [https://stackoverflow.com/questions/1844688/read-all-files-in-a-folder java - Read all files in a folder - Stack Overflow]

#code{{
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();
    }
  }
}
}}

* 参考リンク [#reference]
- [http://msugai.fc2web.com/java/IO/fileObj.html Java入門 ファイル]
- [http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html Using a Swing Worker Thread]
- [http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html How to Use Progress Bars]
- [http://docs.oracle.com/javase/jp/6/api/javax/swing/SwingWorker.html SwingWorker (Java Platform SE 6)]
- [http://java.sun.com/products/jfc/tsc/articles/threads/src/SwingWorker.java SwingWorker.java]
- [http://www.javaworld.com/javaworld/jw-06-2003/jw-0606-swingworker-p3.html Customize SwingWorker to improve Swing GUIs]
- [https://docs.oracle.com/javase/tutorial/uiswing/components/progress.html How to Use Progress Bars]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SwingWorker.html SwingWorker (Java Platform SE 8)]
- [http://web.archive.org/web/20090830092511/http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html Using a Swing Worker Thread]

** コメント [#v7736a30]
- 実際に動作するサンプルを追加してみました。 -- [[aterai]] &new{2006-04-28 (金) 21:50:55};
- ``JDK 6``の``SwingWorker``を使用するように変更しました。 -- [[aterai]] &new{2008-07-11 (金) 15:32:26};
* コメント [#comment]
#comment
- 疑似的なファイル検索ではなく、実際にファイルを検索するようサンプルを修正。 -- &user(aterai); &new{2006-04-28 (金) 21:50:55};
- `JDK 6`の`SwingWorker`を使用するように変更。 -- &user(aterai); &new{2008-07-11 (金) 15:32:26};

#comment