[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] PathTree.java




必要があって、ディレクトリー・ツリーを表示する Java コードを書きました。

以前 DOS 用に C で書いたものがあったのですが、
こちらはファイル名が 8+3 文字対応でした。

C のソースが見当たらなくて、今回 Java で新しく書き直しました。
C のソースの半分以下の行数で書けたので感動しています。

つまらないものですが投稿します。

青柳龍也さんの名著『Java APIプログラミングガイド』p.106〜107 を参考に
しました。

この本は JDK 1.0 なので java.io.FilenameFilter と java.io.File#list()を使っているのですが、
JDK 1.2 の練習を兼ねて java.io.FileFilter と java.io.File#listFiles() を使ってみました。

使い方は

 java PathTree <ディレクトリー名>

でそのディレクトリー配下のサブディレクトリーをツリー表示します。

PathTree.java
=====================================
// show directory tree
// PathTree.java
// copyright(c) 1999 ENDO Yasuyuki <yasuyuki@xxxxxxxxxx>
// 参考図書: 青柳達也『Java APIプログラミングガイド』p.107
//           1996 工学図書 ISBN4-7692-0372-1

import java.io.*;
import java.util.*;

public class PathTree {
  private static final String LEAF     = "|---";//途中の子供
  private static final String BOTTOM   = "+---";//最後の子供
  private static final String SUBTREE  = "|   ";//途中の子供の下位ノード
  private static final String BLANK    = "    ";//最後の子供の下位ノード

  public void retrieve(File dir, String pref) {
    class DirectoryFilter implements FileFilter {
      public boolean accept(File file) { return file.isDirectory(); }
    }
    DirectoryFilter dirfilter = new DirectoryFilter();
    File[] subdirs = dir.listFiles(dirfilter);
    for (int i=0; i<subdirs.length; i++) {
      String before = null;
      String next = null;
      if (i == subdirs.length - 1) {
        before = pref + BOTTOM;
        next = BLANK;
      } else {
        before = pref + LEAF;
        next = SUBTREE;
      }
      System.out.println(before + subdirs[i].getName());//TEST
      retrieve(subdirs[i], pref + next);
    }
  }

  public void retrieve(String dir) {
    retrieve(new File(dir), " ");
  }

  public static void main(String[] args) {
    PathTree ptree = new PathTree();
    System.out.println(args[0]);
    ptree.retrieve(args[0]);
  }
}
=====================================

今回はディレクトリー名しか表示してませんが、
こんなFileFilterを書けば DOS の tree.exe の -f オプションのように
ファイルも一緒にツリー表示できると思います。

class FileOnlyFilter implements FileFilter {
  public boolean accept(File file) { return file.isFile(); }
}
-- 
えんどう やすゆき <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)