ファイルシステムのツリー構造を走査する
戻る
■実行例
$ ./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;
}
}
戻る