ファイルシステムのツリー構造を走査する

戻る

■実行例
$ ./FSTreeViewer.sh  ../.. java pl sh

├\DOCS
│  └\misc
├\MyUtils
│  ├\FSTreeViewer
│  │  ├ FSTreeViewer.java
│  │  ├ FSTreeViewer.sh
│  │  └\RCS
│  ├\MailSender
│  │  └ Attachment.pl
│  ├\TableParser
│  │  ├\RCS
│  │  ├ TableContainer.java
│  │  ├ TableParser.java
│  │  └ upload.sh
│  └\XrefChecker
│     ├ CommentEliminator.java
│     ├\RCS
│     ├ Region.java
│     └ XrefChecker.java
├\RESULT
├\bin
│  ├ CharcodeConverter.pl
│  ├ ChildrenViewer.sh
│  ├ DataGatherer.sh
│  ├ MakeJavaDoc.sh
│  ├ OnlyTraversal.sh
│  ├\RCS
│  ├ RecursiveCrawler.sh
│  ├ RobotsTxtChecker.sh
│  ├ RobotsTxtParser.sh
│  ├\Spider
│  │  ├ ChildrenViewer.java
│  │  ├ ConnectionPropertySetter.java
│  │  ├ ContentStringWriter.java
│  │  ├ CookieContainer.java
│  │  ├ DGUtils.java
│  │  ├ DataGatherer.java
│  │  ├ DataGathererExecuteException.java
│  │  ├ Gatherer.java
│  │  ├ HashedFileNamingContentWriter.java
│  │  ├ HyperLinkURLExtractor.java
│  │  ├ Junk.java
│  │  ├ Label.java
│  │  ├ LabelList.java
│  │  ├ LinkExtractor.java
│  │  ├ LocalFileWriter.java
│  │  ├ LocalFileWriterFactory.java
│  │  ├ PatternMatcher.java
│  │  ├ PropertiesHashMap.java
│  │  ├ PropertiesHashMapNullPointerException.java
│  │  ├ PropertiesManager.java
│  │  ├ PropertiesManagerLoadException.java
│  │  ├\RCS
│  │  ├ RecursiveCrawler.java
│  │  ├ RecursiveCrawlerPropertiesLoadException.java
│  │  ├ RecursiveCrawlerPropertiesNullException.java
│  │  ├ ResponseBodyTransmitter.java
│  │  ├ ResponseHeader.java
│  │  ├ ReverseParentage.java
│  │  ├ RobotsTxtChecker.java
│  │  ├ RobotsTxtParser.java
│  │  ├ Samarium.java
│  │  ├ SamariumUnsupportedCharacterException.java
│  │  ├ SamariumizedFileNamingContentWriter.java
│  │  ├ StatisticsDumper.java
│  │  ├ SummaryInfo.java
│  │  ├ SystemPropertySetter.java
│  │  ├ TagEraser.java
│  │  ├ TreeContainer.java
│  │  ├ TreeNode.java
│  │  ├ TreeNodeNoChildrenException.java
│  │  ├ TreeNodeNullPointerException.java
│  │  ├ TreeViewer.java
│  │  ├ XMLEscaper.java
│  │  ├ XMLExtractionHelper.java
│  │  └ upload.sh
│  ├ Spider-cygwin.sh
│  ├ TreeViewer.sh
│  ├\Utils
│  │  ├ DescriptionNotFoundException.java
│  │  ├ EscapeXMLFilter.java
│  │  ├ KeywordNotFoundException.java
│  │  ├ MetaInfoExtractor.java
│  │  ├ MetaInfoExtractor.sh
│  │  ├ MyURLDecoder.java
│  │  ├\RCS
│  │  ├ TitleNotFoundException.java
│  │  ├ getMetaInfo.sh
│  │  └ upload.sh
│  ├ html2xhtml.sh
│  ├\javadoc
│  │  ├\Spider
│  │  │  └\class-use
│  │  └\resources
│  ├ recursiveGrep.sh
│  └ simplifier.sh
├\conf
│  └\RCS
├\log
│  └\Spider
├\memo
├\props
│  └\RCS
├\sitemap
│  └\2004-12-27
├\test-bin
│  ├ ExtractingInfo.sh
│  ├ PatternMatcher-test.sh
│  ├\RCS
│  ├ alc-test.sh
│  ├ asahi-test.sh
│  ├ connect-time-out-test.sh
│  ├ crawlingTest.sh
│  ├ eclipse.sh
│  ├ infoseek-test.sh
│  ├ mainichi-test.sh
│  ├ read-time-out-test.sh
│  ├ sankei-test.sh
│  └ yomiuri-test.sh
└\test-props
   └\RCS


#!/bin/sh
# $Id: FSTreeViewer.html,v 1.1 2009/06/22 16:11:44 kishi Exp kishi $
# 引数がない場合はカレントパス

java -cp . FSTreeViewer $*




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

/**
<pre>
$Id: FSTreeViewer.html,v 1.1 2009/06/22 16:11:44 kishi Exp kishi $ 
Description: treeコマンドのようなツリー構造を描く 
</pre>
 
@author KISHI Yasuhiro
*/

public class FSTreeViewer {

    /** 引数で指定されたサフィックス */
    static ArrayList suffixes = new ArrayList();

    /** メインメソッド */
    public static void main( String[] args ) {

        String path = null;
        if ( args.length > 0 ) {
            path = args[ 0 ];

            for ( int i = 1;i < args.length;i++ ) {
                suffixes.add( args[ i ] );
            }
        } else {
            System.err.println( "Usage: java -cp . FSTreeViewer [path] [suffix1] ... [suffixN]" );
            System.err.println( "例)java -cp . FSTreeViewer ../../bin/Spider java pl sh" );
            System.exit( 1 );
        }

        // 走査開始のPATH
        File dir = new File( path );

        // ディレクトリかどうかを判定する
        if ( !dir.isDirectory() ) {
            System.out.println( "ディレクトリでないか、またPATHが存在しません" );
        }

        // 先祖の状態を設定するフラグを配列に格納
        // 本当は引数でサイズを指定 -- とりあえず1024もあれば十分だろう(^^)
        boolean[] ancestor = new boolean[ 1024 ];

        /* 一応全要素をfalseに初期化 */
        for ( int i = 0; i < ancestor.length; i++ ) {
            ancestor[ i ] = false;
        }

        // 再帰的にディレクトリを掘っていく
        traverse( dir, 0, ancestor );
    }

    /** トラバースする
    @param dir 処理対象のファイルあるいはディレクトリ
    @param layer 現在のレイヤー
    @param ancestor 親レイヤーの状態
    */
    static private void traverse( File dir, int layer, boolean[] ancestor ) {

        //ディレクトリの内容の取得
        String[] tempList = dir.list();

        // ソートする
        Arrays.sort( tempList );

        // フィルターをかける 
        ArrayList filteredList = filter( dir, tempList );

        //一覧を出力する
        for ( int i = 0; i < filteredList.size(); i++ ) {

            //階層に応じてインデントする
            for ( int j = 0; j < layer; j++ ) {
                if ( ancestor[ j ] ) {
                    System.out.print( "│" );
                } else {
                    System.out.print( " " );
                }
                System.out.print( "  " ); // ホワイトスペース2つ分インデントする
            }

            /* 個別ファイルあるいはディレクトリの表示 */
            if ( i != filteredList.size() - 1 ) {
                /* まだ弟がいる */
                System.out.print( "├" );

                /* このレイヤーに対してフラグをセット */
                /* まだ弟がいる */
                ancestor[ layer ] = true;
            } else {
                /* もう弟がいない */
                System.out.print( "└" );

                /* このレイヤーに対してフラグをセット */
                /* もう弟がいない */
                ancestor[ layer ] = false;
            }

            // 対象ファイル名の表示
            File currentFile = new File( dir, ( String ) filteredList.get( i ) );
            if ( currentFile.isFile() ) {
                System.out.println( " " + ( String ) filteredList.get( i ) );
            } else {
                System.out.println( File.separator + filteredList.get( i ) );
            }

            if ( currentFile.isDirectory() ) {
                /* ディレクトリの場合は、さらに探索 */
                traverse( currentFile, layer + 1, ancestor );
            }
        }
    }

    /** 指定されたサフィックスに応じてフィルターをかける
    @param dir ディレクトリ
    @param in そのディレクトリのファイルリスト
    @return フィルター処理後のリスト
    */
    static private ArrayList filter( File dir, String[] in ) {

        ArrayList al = new ArrayList();

        for ( int i = 0;i < in.length; i++ ) {
            File target = new File( dir, in[ i ] );
            if ( target.isDirectory() ) {
                al.add( in[ i ] );
                // System.err.println( "		DEBUG*** " + in[ i ] );
            } else {
                if ( suffixes.size() == 0 ) {
                    al.add( in[ i ] );
                } else {
                    for ( int index = 0;index < suffixes.size(); index ++ ) {
                        // System.err.println( "suffix: " + suffixes.get(index));

                        if ( in[ i ].endsWith( ( String ) suffixes.get( index ) ) ) {
                            al.add( in[ i ] );
                            break;
                        }
                    }
                }
                // al.add( in[ i ] );
            }
        }

        return al;

    }

}

戻る inserted by FC2 system