2012-08-23 172 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',並把它當作一個循環。 –