Fork me on GitHub

The WebDevil

Enjoy development

Делая первые шаги в руби и рельсах наткнулся на необходимость получить листинг папки без “.” и “..”. Вот так реализовалось:

class Dir
  def self.listing(path, &block)
    return nil if path.nil?
    entries = Dir.entries(path).reject! { |filename| filename=='.' or filename=='..'}
    entries.each(&block) if block_given?
    entries
  end
end

Огромаднейшее спасибо kpumuk‘у за подсказки и помощь нюбу =)

9 Responses to “ruby directory listing”

  1. ггг
    жжешь :)

    FX Poster

  2. Вот во что эта функция эволюционировала:

    class Dir
      def self.listing(params, &block)
        params.stringify_keys!
        return nil if  !params.has_key?('path') or params['path'].nil? or !File.exist?(params['path'])
        params['path'] << '/' if !params['path'].ends_with?('/')

        entries = Dir.entries(params['path'])
        entries.reject! do |filename|
          result = false
          result=true if filename=='.' or filename=='..'
          result=true if params.has_key?('filter') and params['filter'].to_s == 'dirs' and !File.directory?(params['path']+filename)
          result=true if params.has_key?('filter') and params['filter'].to_s == 'files' and !File.file?(params['path']+filename)
          result
        end

        entries.each( &block) if block_given?
        entries
      end
    end

    dm

  3. а с каких пор класс(class Dir) стал называться “функция” ?

    Petruk

  4. Пардон, метод.

    dm

  5. Дим, а почему не через yield’ы? Зачем блок передавать-то?

    FX Poster

  6. А почему бы и нет? В использовании метода разницы не видно в любом случае.

    dm

  7. Я понимаю, что немного не по теме, но все же обьясните где хваленая легкость и элегантность Ruby если на Groovy это пишется в одну строку:

    new File(“.”).eachFile { println it }

    а на “сверхсложном” Java – в 3 строки?

    Вспомним ещё сравнительно низкую производительность RubyVM, “слабые” библиотеки и что останется от хваленого Ruby?

    Vadim

  8. Забавно читать на блоге “отчаянного PHP-шника” о руби :)

    Yuriy Drozdov

  9. Vadim
    Да, Dir.entries(‘path’) даст тот же перечень файлов. Но мне не нужны симлинки, мне не нужны “.” и “..”.

    Последняя версия:

    class Dir
      def self.listing(params, &block)
        params.stringify_keys!
        return nil if  !params.has_key?('path') or params['path'].nil? or !File.exist?(params['path'])
        params['path'] << '/' if !params['path'].ends_with?('/')

        entries = Dir.entries(params['path'])
        entries.reject! do |filename|
          result = false
          result=true if filename=='.' or filename=='..'
          result=true if params.has_key?('filter') and  File.ftype(params['path']+filename) != params['filter'].to_s
          result
        end

        entries.each( &block) if block_given?
        entries
      end
    end

    более культурно отбирает по фильтру

    dm