Ruby File ::目录?问题

时间:2009-11-17 06:06:42

标签: ruby file directory

我对红宝石很新,但到目前为止非常享受它。有些事情给我带来了一些麻烦,以下也不例外。

我在这里要做的是通过对“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

4 个答案:

答案 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)}