Метод `File.directory?` всегда возвращает `false` при передаче элемента Dir.entries.

Я новичок в рубине. Я пытаюсь распечатать структуру каталогов в 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

Этот код просто печатает структуру родительского каталога (массив каталогов). Он не печатает файлы/папки внутри записей моего объекта «dir», то есть никогда не печатает ни подкаталоги, ни «мы здесь!». Метод File.directory? всегда возвращает false.

Рубиновая версия: 1.9.3


person tortuga    schedule 07.08.2014    source источник


Ответы (1)


Вам нужно добавить родителя как Dir.entries не включает цель при перечислении своего содержимого.

File.directory?(File.join(Repo_dir, folder))

File.join — это независимый от платформы способ добавления разделителей между каталогами и файлами. Подумайте об этом как

Repo_dir + '/' + folder

Or

Repo_dir + '\' + folder

Попробуйте и этот:

#!/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)

Or

#!/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)
person konsolebox    schedule 07.08.2014