FindCommand.java



/**
 * カレントディレクトリの下をを再帰的に探索して
 * 指定された名前のファイルを見つけて表示するクラス
 */
import java.io.*;
public class FindCommand {

  /** 探査対象のファイル名 */
    public static String target;

  /** 探査中のディレクトリ */
    public File current;

  /** ディレクトリのパス名 */
    public String path;

  /** ディレクトリ内のファイル */
    public File[] files;

  /** コンストラクタ */
    public FindCommand( File dir ) throws Exception {
        try{
            current = dir;
            path = dir.getPath() + File.separator;
            files = dir.listFiles();
        }
        catch( Exception e ) {
            throw e;
        }
    }

  /** 該当するファイル名の表示のメソッド */
    public void printName() {
        for( int i=0; i<files.length; i++ )
            if( files[i].getName().equals( target ) )
               System.out.println( path + files[i].getName() );
    }

  /** 再帰的にサブディレクトリの探索を呼び出すメソッド */
    public void searchSubDirs() throws Exception {
        for( int i=0; i<files.length; i++ ) {
            if( files[i].isDirectory() ) {
                try {
                     FindCommand sub
                                = new FindCommand( files[i] );
                     sub.printName();
                     sub.searchSubDirs();
                }
                catch( Exception e ){
                    continue;
                }
            }
        }
    }

  /** 最初に呼び出されるメソッド */
    public static void main( String argv[] ){
        try {
            FindCommand.target = argv[0];
            FindCommand top
                = new FindCommand( new File( "." ) );
            top.path = "." + File.separator;
            top.printName();
            top.searchSubDirs();
        }
        catch( ArrayIndexOutOfBoundsException e ) {  // コマンド引数が不足
            System.err.println("Usage:java FindCommand searchname");
            System.exit(-1);
        }
        catch( Exception e ) {   // エラーが発生
            System.err.println("Error....");
            System.exit(-1);
        }
    }
}