`File.directory?`方法在传递Dir.entries元素时总是返回`false`

hty*_*agi 0 ruby directory traversal dir subdirectory

我对红宝石很新.我正在尝试在ruby中打印目录结构.以下是我正在使用的代码:

Repo_dir = 'path_to_the_dir'

dir = Dir.entries(Repo_dir)
dir.each do |folder|
    if folder == '.' or folder == '..'
        print ""
    else    
        print "#{folder}\n"
        if File.directory?(folder) 
            print "we are here !"
            sub_dir = Dir.entries("#{Repo_dir}#{File::SEPARATOR}#{folder}")
                sub_dir.each do |subdir|
                    print "#{subdir}\n"
                end
        end

    end

end
Run Code Online (Sandbox Code Playgroud)

此代码只打印父目录(dir数组)的结构.它不打印我的'dir'对象条目中的文件/文件夹,也就是说,它从不打印子目录,也不打印"我们在这里!".File.directory?方法总是返回false.

Ruby版本:1.9.3

kon*_*box 6

您需要将父添加为Dir.entries在枚举其内容时不包括目标.

File.directory?(File.join(Repo_dir, folder))
Run Code Online (Sandbox Code Playgroud)

File.join是一种在目录和文件之间添加分隔符的独立于平台的方法.想想就好

Repo_dir + '/' + folder
Run Code Online (Sandbox Code Playgroud)

要么

Repo_dir + '\' + folder
Run Code Online (Sandbox Code Playgroud)

试试这个:

#!/usr/bin/env ruby

def show_tree_of_dirs(dir)
  if not dir =~ /\/\.\.?$/ and File.directory?(dir)
    puts dir

    Dir.entries(dir).each do |e|
      show_tree_of_dirs(File.join(dir, e))
    end
  end
end

(dir = ARGV.shift) and show_tree_of_dirs(dir)
Run Code Online (Sandbox Code Playgroud)

要么

#!/usr/bin/env ruby

def show_tree_of_dirs(dir)
  if File.directory?(dir)
    puts dir

    Dir.glob(File.join(dir, '*')).each do |e|
      show_tree_of_dirs(e)
    end
  end
end

(dir = ARGV.shift) and not dir =~ /\/\.\.?$/ and show_tree_of_dirs(dir)
Run Code Online (Sandbox Code Playgroud)