2017-11-10 115 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,它仍然把所有的扩展放在同一行。 –