2012-08-23 175 views
0

我想递归一个目录及其所有子目录。我不想使用“查找”或其他任何方式,除了这一个:Ruby递归目录

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 

我敢肯定,它会工作,我只是不知道为什么它得到stucks在第一个目录!它进入基目录,检查文件是否是目录,然后再次运行SAME功能。但它没有!它卡在第一个文件夹,我得到一个错误!任何帮助?

+0

你为什么用'dir'到你的方法传递,然后从来没有使用它? –

回答

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" } 
2

结账Dir.glob。文档here

+0

因此,而不是“Dir.foreach”我应该使用“Dir.glob”? –

+0

我不想改变我的代码,我的逻辑似乎是正确的,我不知道为什么它不工作 –

+0

是的。所以你不需要递归地写'get_information',并把它当作一个循环。 –