我对红宝石很新,但到目前为止非常享受它。有些事情给我带来了一些麻烦,以下也不例外。
我在这里要做的是通过对“Dir”进行子类化来创建一种“超级目录”。我添加了一个名为'subdirs'的方法,用于列出目录对象的文件,如果文件本身是目录,则将它们推送到数组中。问题是,我的测试(File.directory?)的结果很奇怪 - 这是我的方法代码:
def subdirs
subdirs = Array.new
self.each do |x|
puts "Evaluating file: #{x}"
if File.directory?(x)
puts "This file (#{x}) was considered a directory by File.directory?"
subdirs.push(x)
#yield(x) if block_given?
end
end
return subdirs
end
奇怪的是,即使我选择的目录中有很多目录(“/ tmp”) - 这个调用的结果只列出“。”和“..”
puts "Testing new Directory custom class: FileOps/DirClass"
nd = Directory.new("/tmp")
subs = nd.subdirs
结果:
Evaluating file: mapping-root
Evaluating file: orbit-jvxml
Evaluating file: custom-directory
Evaluating file: keyring-9x4JhZ
Evaluating file: orbit-root
Evaluating file: .
This file (.) was considered a directory by File.directory?
Evaluating file: .gdmFDB11U
Evaluating file: .X0-lock
Evaluating file: hsperfdata_mishii
Evaluating file: .X11-unix
Evaluating file: .gdm_socket
Evaluating file: ..
This file (..) was considered a directory by File.directory?
Evaluating file: .font-unix
Evaluating file: .ICE-unix
Evaluating file: ssh-eqOnXK2441
Evaluating file: vesystems-package
Evaluating file: mapping-jvxml
Evaluating file: hsperfdata_tomcat
答案 0 :(得分:17)
您是否在/tmp
内执行脚本?我的猜测(我还没试过)是File.directory?(x)
正在测试当前目录中是否有一个名为x的目录 - 所以,如果你从另一个目录运行它,你总会发现.
和..
但不是其他目录。
尝试将File.directory?(x)
更改为File.directory?("#{path}/#{x}")
。
答案 1 :(得分:9)
答案 2 :(得分:0)
我做了一些小改动......
class Directory < Dir
def subdirs
subdirs = []
each do |x|
puts "Evaluating file: #{x}"
if File.directory? File.join path, x
puts "This file (#{x}) was considered a directory by File.directory?"
subdirs << x
#yield(x) if block_given?
end
end
subdirs
end
end
puts "Testing new Directory custom class: FileOps/DirClass"
nd = Directory.new "/tmp"
puts subs = nd.subdirs
答案 3 :(得分:0)
用你想要的任何路径替换*,你很高兴。 Glob使用bash globbing获取某些路径中的所有文件,因此您可以使用*和**以及范围等。非常好。
选择的工作方式与拒绝相反,只挑选选择块中的值。
Dir.glob(“*”)。选择{| f | File.directory?(f)}