2013-05-08 54 views
0

試圖編寫腳本,該腳本將搜索特定文件的目錄和子目錄。我想知道某個目錄是如何調用某個方法的。到達目錄時的目錄遍歷方法

這是我嘗試和失敗:

def display_directory(path) 
list = Dir[path+'/*'] 
return if list.length == 0 

list.each do |f|  

    if File.directory? f #is it a directory? 
    if File.directory?('config') 
     puts "this is the config folder" 
    end 
    printf "%-50s %s\n", f, "is a directory:".upcase.rjust(25) 
    else 
    printf "%-50s %s\n", f, "is not a directory:".upcase.rjust(25) 
    end 
end 
end 


start = File.join("**") 
puts "Processing directory\n\n".upcase.center(30) 
display_directory start 

這是我希望發生的。

 app 
app/controllers 
app/helpers 
app/mailers 
app/models 
app/models/bugzilla 
app/models/security 
app/views 
app/views/auth 
app/views/calendar 
app/views/layouts 
app/views/step 
app/views/step_mailer 
app/views/suggestion 
app/views/suggestion_mailer 
app/views/task 
app/views/user 
bin 
-------------------------------------- 
config <----------(call method foo) 
config/environments 
config/initializers 
config/locales 
-------------------------------------- 
db 
db/bugzilla 
db/migrate 
db/security 
lib 
lib/tasks 
log 
public 
public/images 
public/javascripts 
public/stylesheets 
script 
script/performance 
script/process 
-------------------------- 
test <---------(call method foobar) 
test/fixtures 
test/fixtures/mailer 
test/functional 
test/integration 
test/performance 
test/unit 
-------------------------- 
vendor 
vendor/plugins 
+0

爲什麼失敗?錯誤?發生了什麼?你的腳本的輸出是什麼?什麼紅寶石版本? – fotanus 2013-05-08 20:11:56

+0

它打印出「這是配置文件夾」,但它是錯誤的文件夾。 '這是配置文件夾tmp/cache/B27/910'是一個真正的目錄,而不是我正在尋找的目錄。我的if語句關閉。 – 2013-05-08 20:14:12

+0

我不明白你的措辭。你能否以確切的期望重新提出你的問題? – dimitarvp 2013-05-08 21:02:31

回答

0

相反

if File.directory?('config') 

嘗試

if f.path.include?('config') 

但這會爲每一個有名字config目錄工作。你可以放一個更大的子串來做更好的匹配。

此外,它在紅寶石使用do..end多行塊和{..}爲單行非常地道。

0

我想出了一個辦法。這工作得很好。我已經添加了一個方法來顯示所提到目錄中的所有文件。

def special_dir(path) 
    puts "------------------------------------" 
    sp_path = Dir.glob(File.join(path,"*","**")) 
    sp_path.each do |cf| 
    puts "\t" + cf 
    end 
end 

def walk(path) 
    list = Dir[path+'/*'].reject{ |r| r['doc'] || r['tmp']} 
    list.each do |x| 
     path = File.join(path, x) 
     if File.directory?(x) 
     if x =~ /config/ or x =~ /test/ 
      special_dir(x) 
     else 
      puts "#{x}" 
      walk(path) 
     end 
     else 
     #puts x 
     end 
    end 
    end 

    start = File.join("**") 

    walk start