我想构建一个用于存储目录的哈希。我想拥有多个级别的密钥。在匹配点,我想要一个文件数组。它就像计算机上的目录结构。看起来哈希是最好的方法。
鉴于我有一系列文件夹["folder1", "folder1a", "folder1ax"]
,我该怎么做:
我正在使用它解析URL以在文件夹结构中显示它们,这与在Rails应用程序中转储到JSTree非常相似。因此,如果您有更好的替代方法来显示与Rails视图一起使用的5000个URL,请提供替代方案。
答案 0 :(得分:1)
这是一个起点:
dirs = %w(Downloads)
Hash[ dirs.map{ |dir| [dir, Dir.glob("#{dir}/*")] } ]
结果如下:
{"Downloads"=> ["Downloads/jquery-ui-1.9.1.custom.zip", ... ] }
您可以优化代码f.e.使其递归,从数组结果中删除文件夹名称...这是递归实现的一个示例:
class Dir
def self.ls_r(dir)
Hash[ dir,
entries(dir).reject{ |entry| %w(. ..).include?(entry) }.map do |entry|
entry_with_dir = File.join(dir, entry)
File.directory?(entry_with_dir) ? ls_r(entry_with_dir) : entry
end ]
end
end
puts Dir.ls_r('~/Downloads').inspect
#=> { "Downloads" => ["file1", {"Downloads/folder1"=>["subfile1"], ... ] } ... }
请注意,这不是最佳实现,因为递归不会考虑子文件夹键应该相对于相应的父键;要解决此问题,应通过递归维护此信息:
class Dir
def self.ls_r(dir, key_as_last_path_component = false)
Hash[ (key_as_last_path_component ? File.split(dir).last : dir),
entries(dir).reject{ |entry| %w(. ..).include?(entry) }.map do |entry|
entry_with_dir = File.join(dir, entry)
File.directory?(entry_with_dir) ? ls_r(entry_with_dir, true) : entry
end ]
end
end
puts Dir.ls_r('~/Downloads').inspect
#=> { "Downloads" => ["file1", {"folder1"=>["subfile1"], ... ] } ... }
现在子文件夹与其父键相关。