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

No Subject




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

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

public class TreeTable {
  private static final String LEAF     = "<TD>├─</TD>"; // 途中の子供
  private static final String BOTTOM   = "<TD>└─</TD>"; // 最後の子供
  private static final String SUBTREE  = "<TD>│ </TD>"; // 途中の子供の下位ノード
  private static final String BLANK    = "<TD>  </TD>"; // 最後の子供の下位ノード

  static int depth = 0; // 全体の深さ

  private Vector tree = new Vector(); // 1 ノードにつき 3 要素をaddする
                                      //   0: String  接頭辞 "<TR><TD>...</TD>"
                                      //   1: String  ファイルまたはディレクトリー名
                                      //   2: Integer そのノードの深さ

  //ディレクトリーの再帰探索
  public void retrieve(File dir, String pref, int node_depth) {
    class DirectoryFilter implements FileFilter {
      public boolean accept(File file) { return file.isDirectory(); }
    }
    class FileOnlyFilter implements FileFilter {
      public boolean accept(File file) { return file.isFile(); }
    }
    if (node_depth > this.depth) this.depth = node_depth;
    File[] subdirs = dir.listFiles(new DirectoryFilter());
    File[] files = dir.listFiles(new FileOnlyFilter());
    String fbefore = null;
    if (subdirs.length > 0) fbefore = pref + SUBTREE;
    else                    fbefore = pref + BLANK;
    for (int i=0; i<files.length; i++) {
      tree.addElement(fbefore);                  // "<TR><TD>...</TD>"
      tree.addElement(files[i].getName());       // ファイル名
      tree.addElement(new Integer(node_depth));  // 深さ
    }
    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;
      }
      tree.addElement(before);                           // "<TR><TD>...</TD>"
      tree.addElement(subdirs[i].getName());             // ディレクトリー名
      tree.addElement(new Integer(node_depth));          // 深さ
      retrieve(subdirs[i], pref + next, node_depth + 1);
    }
  }

  public void retrieve(String dir) {
    retrieve(new File(dir), "<TR>", 1);
  }

  //ディレクトリー/ファイルをHTML Tableで表示
  public void showTree() {
    System.out.println("<TABLE borde=\"0\">");
    Enumeration e = tree.elements();
    while (e.hasMoreElements()) {
      String pref = (String)e.nextElement();                  // "<TR><TD>...</TD>"
      String name = (String)e.nextElement();                  // ファイル/ディレクトリー名
      int node_depth = ((Integer)e.nextElement()).intValue(); // 深さ
      int colspan = depth - node_depth + 1;                   // セルの幅
      System.out.println(pref + "<TD colspan=\"" + colspan + "\">" + name + "</TD></TR>");
    }
    System.out.println("</TABLE>");
  }

  public static void main(String[] args) {
    TreeTable ttable = new TreeTable();
    ttable.tree.addElement("<TR>");         // "<TR>
    ttable.tree.addElement(args[0]);        // 最上位のディレクトリー名
    ttable.tree.addElement(new Integer(0)); // 深さ0
    ttable.retrieve(args[0]);
    ttable.showTree();
  }
}
-- 
えんどう やすゆき <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)