// This example is from the book _Java in a Nutshell_ by David Flanagan. // Written by David Flanagan. Copyright (c) 1996 O'Reilly & Associates. // You may study, use, modify, and distribute this example for any purpose. // This example is provided WITHOUT WARRANTY either expressed or implied. import java.awt.*; import java.io.*; public class FileLister extends Frame { private List list; private TextField infoarea; private Panel buttons; private Button parent, quit; private FilenameFilter filter; private File cwd; private String[] entries; // Create the graphical user interface, and list the initial directory. public FileLister(String directory, FilenameFilter filter) throws IOException { super("File Lister"); this.filter = filter; list = new List(12, false); infoarea = new TextField(); infoarea.setEditable(false); buttons = new Panel(); parent = new Button("Up a Directory"); quit = new Button("Quit"); buttons.add(parent); buttons.add(quit); this.add("Center", list); this.add("South", infoarea); this.add("North", buttons); this.resize(550, 350); this.show(); // list the initial directory. list_directory(directory); } // This method uses the list() method to get all entries in a directory // and then displays them in the List component. public void list_directory(String directory) throws IOException { File dir = new File(directory); if (!dir.isDirectory()) throw new IllegalArgumentException("FileLister: no such directory"); list.clear(); cwd = dir; this.setTitle(directory); entries = cwd.list(filter); for(int i = 0; i < entries.length; i++) list.addItem(entries[i]); } // This method uses various File methods to obtain information about // a file or directory. Then it displays that info in a TextField. public void show_info(String filename) throws IOException { File f = new File(cwd, filename); String info; if (!f.exists()) throw new IllegalArgumentException("FileLister.show_info(): " + "no such file or directory"); if (f.isDirectory()) info = "Directory: "; else info = "File: "; info += filename + " "; info += (f.canRead()?"read ":" ") + (f.canWrite()?"write ":" ") + f.length() + " " + new java.util.Date(f.lastModified()); infoarea.setText(info); } // This method handles the buttons and list events. public boolean handleEvent(Event e) { if (e.target == quit) System.exit(0); else if (e.target == parent) { String parent = cwd.getParent(); if (parent == null) parent = "/"; // Bug workaround try { list_directory(parent); } catch (IllegalArgumentException ex) { infoarea.setText("Already at top"); } catch (IOException ex) { infoarea.setText("I/O Error"); } return true; } else if (e.target == list) { // when an item is selected, show its info. if (e.id == Event.LIST_SELECT) { try { show_info(entries[((Integer)e.arg).intValue()]); } catch (IOException ex) { infoarea.setText("I/O Error"); } } // When the user double-clicks, change to the selected directory // or display the selected file. else if (e.id == Event.ACTION_EVENT) { try { String item = new File(cwd, (String)e.arg).getAbsolutePath(); try { list_directory(item); } catch (IllegalArgumentException ex) {new FileViewer(item);} } catch (IOException ex) { infoarea.setText("I/O Error"); } } return true; } return super.handleEvent(e); } public static void usage() { System.out.println("Usage: java FileLister [directory_name] " + "[-e file_extension]"); System.exit(0); } // Parse command line arguments and create the FileLister object. // If an extension is specified, create a FilenameFilter for it. // If no directory is specified, use the current directory. public static void main(String args[]) throws IOException { FileLister f; FilenameFilter filter = null; String directory = null; for(int i = 0; i < args.length; i++) { if (args[i].equals("-e")) { i++; if (i >= args.length) usage(); filter = new EndsWithFilter(args[i]); } else { if (directory != null) usage(); // Already set else directory = args[i]; } } // if no directory specified, use the current directoy if (directory == null) directory = System.getProperty("user.dir"); // Create the FileLister object f = new FileLister(directory, filter); } } // This class is a simple FilenameFilter. It defines the required accept() // method to determine whether a specified file should be listed. A file // will be listed if its name ends with the specified extension, or if // it is a directory. class EndsWithFilter implements FilenameFilter { private String extension; public EndsWithFilter(String extension) { this.extension = extension; } public boolean accept(File dir, String name) { if (name.endsWith(extension)) return true; else return (new File(dir, name)).isDirectory(); } }