0

ディレクトリとそのすべてのサブディレクトリを再帰しようとしています。「検索」やこれ以外の方法は使いたくありません。

task :locate do

    Dir.chdir(Dir.pwd+"/public/servers_info/config/deploy/")
    puts "Current Directory is: "+ Dir.pwd
    dir = Dir.pwd

    def get_information(dir)

        Dir.foreach(".") {|f|
            next if f == '.' or f == '..'

            if File.directory? f
                puts f
                #puts Dir.pwd+"/"+f
                get_information(Dir.pwd+"/"+f)
            else
                puts "Not Directory"
            end         
            }
    end

    get_information(dir)

end

私はそれがうまくいくと確信しています、なぜそれが最初のディレクトリでスタックするのか分かりません!ベースディレクトリに入り、ファイルがディレクトリかどうかをチェックしてから、同じ機能を再度実行します。しかし、そうではありません!最初のフォルダでスタックし、エラーが発生します。何か助けはありますか?

4

2 に答える 2

4

あなたのコードは常に「現在の」(。)ディレクトリを見ています。get_informationメソッドは、にバインドされた値を渡しますがdir、これは決して使用しません。

そのパラメータを使用することはないため、ディレクトリを変更することはありません。

あなたがやろうとしていることは、で簡単ですDir.globが、あなたがあなたの解決策に夢中になっているなら、あなたはのDir.foreach(".")ようなものに変える必要があるでしょうDir.foreach(dir)

追加するために編集:サブディレクトリのリストを印刷するだけの場合は、

puts Dir.glob('*/**').select { |f| File.directory? f}

これにはディレクトリのみが含まれます。既存のコードの正確な出力にかなり近づけたい場合は、次のようにします。

puts Dir.glob('*/**').map { |f| File.directory?(f)? f : "Not a Directory" } 
于 2012-08-23T17:08:57.843 に答える
2

チェックアウトDir.globここのドキュメント

于 2012-08-23T17:00:59.157 に答える