2017-11-10 182 views
1

中給出的目錄獲取文件信息一直在爲學校開發一個程序,並且需要幫助獲取一些片段。從命令行參數

目標是接受任何目錄的命令行參數,並顯示有關每個具有擴展名的文件的一些信息。我主要工作,但需要一些額外的幫助。

的文件只需要一對夫婦更多的事情:

  1. 集團的擴展和計數。
  2. 接受多個參數,並且如果沒有給定,則默認爲當前目錄。
  3. 計算每個的數量/顯示總大小/並在顯示錯誤時給出顯示錯誤,如果該目錄不存在或者我無法訪問它。

目前,它確實從目錄中獲取文件,顯示擴展名並放出文件的大小。下面是我迄今爲止編寫的代碼:

directory=ARGV[0] 
searchstring= Regexp.new "(\\.[^.]+)$" 


if File.exists? File.expand_path(directory) 
Dir["#{File.expand_path(directory)}/*"].each.map { |f| File.basename(f) 


    if File.basename(f)=~searchstring 
    puts "Extension: #{File.extname(f)} Count: Size: #{File.stat(f).size}" 
    end 
} 
else 
puts "This directory does not exist" 
end 

輸出看起來像這樣至今:

Extension: .rb Count: Size: 104 
Extension: .rb Count: Size: 381 
Extension: .xml Count: Size: 84252 
Extension: .rb Count: Size: 107 
Extension: .rb Count: Size: 377 
Extension: .sql Count: Size: 1763 
Extension: .rb Count: Size: 123 
Extension: .rb Count: Size: 189 
Extension: .db Count: Size: 10240 
Extension: .rb Count: Size: 791 

編輯:我如果目錄存在,它檢查。我將在上面粘貼我的新代碼。儘管如此,仍然需要其他幫助。特別是將擴展存儲爲一個組(hash?)。

+0

我已經嘗試了多次迭代的ARGV.each做,但我無法讓它循環通過多個命令行參數,不管我做什麼嘗試。 我還沒有看到給定參數中的所有子目錄。 –

+2

我已經回滾編輯了一下,儘量避免用答案更新你的問題,而是投票有用的答案,並接受最有幫助的答案。通過這種方式,未來的讀者可以看到您遇到了哪些問題以及彼得如何能夠幫助您,而不是僅僅看到彼得的答案與問題中發佈的代碼完全相同。如果您還有其他問題,請考慮發佈一個新問題並鏈接回這個問題,如果需要額外的上下文 –

+0

感謝Simple Lime。我以爲我正在通過更新來幫忙。我將爲未來的問題記住這一點。我可能會在明天發佈一個更新的問題,然後回到這個問題。 –

回答

2

關於你的第二個問題:ARGV[0] || Dir.pwd應該做你想要一個計數和每個擴展的大小該文件夾中的擴展名的哈希我想的伎倆或File.dirname(__FILE__)

,應該是這樣的

directory = ARGV[0] || Dir.pwd 
searchstring = Regexp.new "(\\.[^.]+)$" 

extensions = Hash.new {|hash, key| hash[key] = {size: 0, count: 0}} 

if File.exists? File.expand_path(directory) 
    Dir["#{File.expand_path(directory)}/*"].each.map do |f| 
    if File.basename(f) =~ searchstring 
     extensions[File.extname(f)][:size] += File.stat(f).size 
     extensions[File.extname(f)][:count] += 1 
    end 
    end 
else 
    puts "This directory does not exist" 
end 

p extensions 

如果你想知道什麼Hash.new {|hash, key| hash[key] = {size: 0, count: 0}}意味着: 您的默認值分配給哈希extensions這是默認的內容的散列值{大小:0,數:0} 你需要的大小和數量是0而不是零,因爲你做了+=就可以了,這不可能在零

+0

我得到這樣的錯誤:「未初始化的常量DIR(NameError)。我甚至試過如果ARGV = empty?directory = DIR.pwd。我得到了同樣的錯誤 –

+0

它是Dir,而不是DIR,Ruby區分大小寫,是標準庫的一部分,所以應該與MRI Ruby版本一起工作,Dir [***]方法在使用通配符的路徑方面也相當強大和擴展,所以你可以跳過seachstring部分 – peter

+0

我真的很感謝幫助。我真的被困在如何將它們放入哈希中,這正是我所需要的。在單獨的行上顯示這些內容的最簡單方法是什麼?我嘗試了一個put,它仍然把所有的擴展放在同一行。 –