ディレクトリの階層構造をツリー表示したい

このQ&Aのポイント
  • 指定したディレクトリ以下のディレクトリの階層構造を、インデントをつけてツリー表示するプログラムを作成したい。
  • 現在はディレクトリ名を表示することはできているが、インデントをうまくつける方法に悩んでいる。
  • どのような方法や修正を行えば、ディレクトリの階層構造をツリー表示できるのか教えてほしい。
回答を見る
  • ベストアンサー

ディレクトリの階層構造をツリー表示したい

指定したディレクトリ以下のディレクトリの階層構造を、ツリー表示するプログラムを作りたいと思っています。 階層構造は、階層が下がるごとにインデントをつけてツリー表示したいと思っています。 指定ディレクトリ以下のディレクトリ名をすべて表示させるところまではできたのですが、インデントをうまくつけられずに困っています。 ソースは以下のようにしました。 ---------------------------------- import java.io.File; public class DirTree { String dirName; void showDirName(){ File directory = new File(dirName); File[] subFiles = directory.listFiles(); for (int i = 0; i < subFiles.length; i++) { if(subFiles[i].isDirectory()==true) { System.out.println(subFiles[ i ].getName() ); dirName = subFiles[ i ].getPath(); showDirName(); } } } } --------------------------------------------- 何かよい方法や、ここをこうしたらと言うのがありましたら教えていただけませんでしょうか。 よろしくお願いいたします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。 >インデントをうまくつけられずに困っています。  インデントはメソッドの引数で指定するように作って、メソッドを呼ぶときに現在の階層に一つ足した数を渡してやればいいのではないでしょうか。  メソッド内でインデントの数だけ空白なりタブなりを追加してやればいいと思います。 (コンパイルするときは全角スペースを半角スペースに変換してからにしてください) import java.io.*; public class DirTree {   public static void main(String[] args) {     showDirName(new File("C:\\hoge\\hoge"), 0);   }      static void showDirName(File dir, int indent) {     if (dir.isDirectory()) {       StringBuffer sb = new StringBuffer();       //インデントの深さの分までタブを入れる       for(int i = 0; i < indent; i++) {         sb.append("\t");       }       sb.append(dir.getName());       System.out.println(sb.toString());              File[] dirList = dir.listFiles();       for (int i = 0; i < dirList.length; i++) {         //現在のインデントに1足して再帰的にメソッドを呼ぶ         showDirName(dirList[i], indent + 1);       }     }   } }

mikku_ku
質問者

お礼

解決しました、ありがとうございました! for文でまわして、StringBufferを使えばよかったのですね…大変参考になりました。 ご丁寧にソースまでつけてくださって本当にどうもありがとうございました!

関連するQ&A

  • ディレクトリツリーの表示

    Perlでtreeコマンドのような指定したディレクトリ以下の ディレクトリツリーを表示(取得)するモジュールなどはないでしょうか。 CPANから探してみたのですが英語の上に実行サンプルが載って いなかったりと該当するものかどうかの判断ができません。 名前や説明から該当しそうな(?)Perlモジュール ・Dir::Which ・File::CheckTree ・File:Find ・File::Path ・File::Searcher ・Tree::File など 因みに、環境非依存にしたいのでexecやバッククオートを使用したりは できません。

    • ベストアンサー
    • Perl
  • 条件付きディレクトリツリー表示について

    ある条件(例えばパーミッションや更新日付)でファイルを抽出し、ディレクトリツリーを表示したいと思っています。 http://www.sound-uz.jp/php/tips/file.html のページを参考(ディレクトリツリーの部分)に作っているのですが、条件を元にファイルを配列に入れても、そのフォルダに条件に当てはまるファイルが一つも無い(要素が無い)場合にもフォルダは表示されてしまいます。 配下にマッチするファイルが一つも無い場合は、上位のフォルダも表示させないようにするにはどうしたらいいのでしょうか? かなり困っていますのでご教授お願いします。 ---参考にプログラム掲載------ function showdirtree( $tree ) { if( !is_array( $tree ) ) // 配列でなければ false を返す return false; static $count = 0; // インデントの階層の深さ $indent = ( $count ) ? str_repeat( "&nbsp;&nbsp;&nbsp;&nbsp;", $count ) : ""; $count++; foreach( $tree as $key => $value ) { if( is_array( $value ) ) { // 配列の場合ディレクトリ名を表示し再帰呼出 print( $indent."+ " . $key . "<br>\n" ); showdirtree( $value ); } elseif( preg_match( "/.*(\.html|\.txt|\.php)$/i", $value ) ) { // HTMLとTEXTとPHPのみアンカーをつけてファイル名を表示 print( $indent."- <a href=\"" . $value . "\" target=\"view\">" . $key . "</a><br />\n" ); } } $count--; return true; }

    • ベストアンサー
    • PHP
  • ディレクトリツリー表示PHP

    http://smkn.xsrv.jp/blog/2009/04/directory_tree_with_php_and_jquery/ 上記ディレクトリツリー表示を使いたいのですが わがままなのですが、階層をフォルダアイコン等で表示できるものはないでしょうか? ご存知のかた、よろしくお願いします

    • 締切済み
    • PHP
  • PHP 階層構造 維持 ディレクトリ

    現在指定したディレクトリを中にあるサブディレクトリやファイルを丸ごと階層構造を維持したまま圧縮したいのですが、うまくいきません下記のサイトを参考にしましたがエラーが出てしまいます。例外処理らしいのですが、ドキュメントを読んでもエラーの内容がうまく理解ができません よろしくお願いします。 http://php-archive.net/php/zip-directory/ エラー文 Fatal error: Uncaught Error: Call to undefined function zipDirectory() in C:\MAMP\htdocs\upload\upload-file.php:134 Stack trace: #0 {main} thrown in C:\MAMP\htdocs\upload\upload-file.php on line 134 コード define("file_zone","C:/MAMP/htdocs/upload/test/"); if(isset($_POST["download"])){ // 圧縮するディレクトリー $dir = dirname(__FILE__) . '/test/'; // Zipファイルの保存先 $file = dirname(__FILE__); zipDirectory($dir, $file); // ディレクトリを圧縮する function zipDirectory($dir, $file, $root=""){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } } }

    • ベストアンサー
    • PHP
  • perl ディレクトリ ツリー表示

    下記ソースコードでカレントディレクトリのツリー表示ができますが、これを特定のディレクトリ内をツリー表示できるようにする方法がわかりません。 opendir関数の$dirの前にtestをつけましたが、うまく行きません。 特定のディレクトリは任意で変えることができることとします。 sub treelist_ { my ($dir, $lv) = @_; opendir my $dh, $dir; my @files = grep { $_ !~ /^\.\.?$/; } readdir $dh; closedir $dh; for my $file (@files) { print ">" x $lv, "$dir/$file\n"; treelist_("$dir/$file", $lv+1) if -d "$dir/$file"; } } sub tree { for my $dir (@_) { print "$dir\n"; treelist_($dir, 0); } } tree('.');

  • カレントディレクトリがわからない

    Vistaにしてしまったため、どこに何があるのかが全くわからなくて困っています。 ツリー構造(ルートからの階層)を表示させるような方法は無いのでしょうか? 取り急ぎは、パブリックというディレクトリがどこにあるのかがわかりません。 教えていただけるでしょうか。 よろしくお願いします。

  • ディレクトリ構造の表示

    任意のディレクトリ構造を分析してその構造(ファイル名をkey)をXMLなりハッシュに吐き出すことができるモジュールなり方法を模索しています。 XMLでいうXML::Simpleみたいなものです。 参考------------------------------------------------------ 【XML分析:XML::Simple】→【ハッシュ:Data::Dumper】 【XML分析:XML::Simple】→【XMLファイル:XML::Simple】 ---------------------------------------------------------- グーグルなどで検索してみた限りでは、任意のディレクトリ内分析をしてくれてXMLなりハッシュに吐き出してくれるモジュールはなさそう。 そこでFile::Pathを使ってディレクトリ内を洗ってその構造を動的にハッシュにしたいと考えいます。しかし残念なことに予め構造がわかっている規則的なデータを動的にハッシュにすることはできるのですが、実際に分析するまでその階層すらわからない不規則なツリー状のデータ構造を動的にハッシュ化するプログラミング能力を持ち合わせていません。 そこで質問しかないということになりました。ぜひお知恵をお借りしたいと思っています。よろしくお願いいたします。 本当に簡単ですがこのような不規則なディレクトリ構造を動的にハッシュにしたいと思っています。この例ではディレクトリ構造がわかってますが、分析するまでわからないものとしてみて頂ければと思います。 test1(dir)―――――test2(dir)――――――――data1.txt(file)            |           |            ―data1.txt(file)   ―data2.txt(file)            |            ―data2.txt(file) $test1 = {       'test2' => {            'data1' =>                          {                       'path' => 'test1/data.txt',                       'parent_dir' => 'test2'                         },            'data2' =>                          {                       'path' => 'test2/data.txt',                       'parent_dir' => 'test2'                         },                 },       'data1' =>                     {                  'path' => 'test1/data.txt',                  'parent_dir' => 'test1'                    },       'data2' =>                     {                  'path' => 'test2/data.txt',                  'parent_dir' => 'test1'                    }     };

    • ベストアンサー
    • Perl
  • ディレクトリ内一覧表示

    現在PHPにてディレクトリ内の中のディレクトリ一覧を作成しています。 わからないことがあり、ご投稿させていただきました。 imageフォルダの中に 20110101フォルダと20100101フォルダを作成しています。 imageフォルダ内のディレクトリを一覧表示させたいのですが、下記ソースですと、20110101しか表示されません。 おわかりの方がいらっしゃいましたらご教示お願いします。 $path = 'imageフォルダまでの絶対パス'; $dir = scandir($path, 1);//フォルダ内降順指定 if($dir != "." && $dir != "..") { $dirArray = array($dir); foreach($dirArray as $dir => $val) { for($i = 0; $i <= $dir; $i++) { $dirName = count($dirArray); echo $val[$dirName]; } } } closedir($dir); 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP/icludeを使った相対パスの引き方について

    プログラム初心者です。 includeやrequireなどの関数を使ってファイルを呼び込むために、下記のようなソースを作りましたが、Fatalエラーになってしまいます。どこがいけないのかご指摘をいただけないでしょうか? ネットでこれらの関数の扱い方について検索しますと、PHPでは実行されたファイルのディレクトリがルートとして扱われるそうで、他のディレクトリを参照する時は、相対パスのみでは無理の様子でした。この場合、組込み定数となる__FILE__を使って絶対パスを導かなければいけないような記述がありました。これに習って書いてみたのですが、どうもうまくいきませんのでご指導をいただければと思います。 ■以下、ツリー構造 root |_con ←フォルダ階層 | |_nav.php ←ファイル階層 |_mod | |_nav.csv |_view |_index.php ■以下、phpファイル群 /////// nav.php ////////// <?php $Data=file (dirname(__FILE__)."/../mod/nav.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$DataN[$i]); ?> /////// index.php //////// <?php include once (dirname(__FILE__). "/../con/nav.php"); ?>

    • ベストアンサー
    • PHP
  • javaでコンパイルが出来ない

    java勉強中の初心者です。 カレントディレクトリのファイルを一覧表示するプログラムを作ろうと思い、下のようなコードを書いたのですが、 「構文解析中にファイルの終わりに移りました」というエラーが出ます。 何度か見直したんですが、コードが間違っているのか、どこか別に問題があるのかわかりません。 教えてください。よろしくお願いします。 ________________________________________________________________ import java.io.File; public class ListFiles { public static void main(String[] args) { ListFiles listFiles = new ListFiles(); listFiles.execute(); } private void execute() { File currentDir = new File("."); File[] files=currentDir.listFiles(); for (File file : files) { String fileName = file.getName(); String kind; if (file.isDirectory()) { kind="DIR "; }else{ kind="FILE"; } System.out.printf("%s %s%n", kind, fileName); } }

専門家に質問してみよう