001 /* Copyright 2000, 2001, Compaq Computer Corporation */ 002 003 package javafe.filespace; 004 005 006 import java.io.*; 007 008 import javafe.genericfile.*; 009 010 011 /** 012 * A FileTree is a Tree that mirrors the contents of a disk filesystem; 013 * the constructor takes in a directory and returns a tree representing 014 * the filesystem rooted at that directory.<p> 015 * 016 * FileTree works by scanning directories the first time clients 017 * ask for information about that part of the tree. If the filesystem 018 * is changed afterwards, the changes will not be visible in the 019 * FileTree.<p> 020 * 021 * The data field of every (sub)node in a FileTree contains a 022 * non-null NormalGenericFile representing the file it mirrors on disk.<p> 023 */ 024 025 class FileTree extends PreloadedTree { 026 027 /** The directory we are a snapshot of */ 028 protected File dir; 029 030 031 /*************************************************** 032 * * 033 * Creation: * 034 * * 035 **************************************************/ 036 037 /** Create a root node: */ 038 //@ requires dir != null; 039 public FileTree(File dir) { 040 super(new NormalGenericFile(dir)); 041 this.dir = dir; 042 } 043 044 /** Create a non-root node: */ 045 //@ requires dir != null; 046 //@ requires parent != null && label != null; 047 protected FileTree(Tree parent, String label, File dir) { 048 super(parent, label, new NormalGenericFile(dir)); 049 this.dir = dir; 050 } 051 052 053 /*************************************************** 054 * * 055 * Loading the edges map: * 056 * * 057 **************************************************/ 058 059 /** Load the edges map for use. */ 060 protected void loadEdges() { 061 /* 062 * If our directory is null or not an actual existing directory 063 * on disk, we have no children: 064 */ 065 if (dir == null || !dir.isDirectory()) 066 return; 067 068 /* 069 * Get all the filenames in our directory. If the directory is 070 * unreadable (permission errors, etc.), we have no children: 071 */ 072 String[] filenames = dir.list(); 073 if (filenames == null) 074 return; 075 076 /* 077 * Add all of them as either sub-FileTree's (if a directory) or 078 * LeafTree's (if not a directory): 079 */ 080 for (int i=0; i<filenames.length; i++) { 081 if (filenames[i]==null) 082 continue; 083 084 File file = new File(dir, filenames[i]); 085 086 Tree subtree; 087 if (file.isDirectory()) 088 subtree = new FileTree(this, filenames[i], file); 089 else 090 subtree = new LeafTree(this, filenames[i], 091 new NormalGenericFile(file)); 092 093 edges.put(filenames[i], subtree); 094 } 095 } 096 097 098 /*************************************************** 099 * * 100 * Debugging functions: * 101 * * 102 **************************************************/ 103 104 /** A simple test driver */ 105 //@ requires \nonnullelements(args); 106 public static void main(String[] args) { 107 if (args.length>1) { 108 System.out.println("FileTree: usage [<directory>]"); 109 return; 110 } 111 String dirName = "."; // Default directory = . 112 if (args.length==1) 113 dirName = args[0]; 114 115 /* 116 * Create a new FileTree rooted at the given directory name then 117 * print it out. 118 */ 119 Tree T = new FileTree(new File(dirName)); 120 T.print(""); 121 } 122 }