Делая первые шаги в руби и рельсах наткнулся на необходимость получить листинг папки без “.” и “..”. Вот так реализовалось:
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
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‘у за подсказки и помощь нюбу =)
ггг
жжешь
FX Poster
December 29th, 2007
Вот во что эта функция эволюционировала:
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
January 2nd, 2008
а с каких пор класс(class Dir) стал называться “функция” ?
Petruk
January 2nd, 2008
Пардон, метод.
dm
January 3rd, 2008
Дим, а почему не через yield’ы? Зачем блок передавать-то?
FX Poster
January 5th, 2008
А почему бы и нет? В использовании метода разницы не видно в любом случае.
dm
January 6th, 2008
Я понимаю, что немного не по теме, но все же обьясните где хваленая легкость и элегантность Ruby если на Groovy это пишется в одну строку:
new File(“.”).eachFile { println it }
а на “сверхсложном” Java – в 3 строки?
Вспомним ещё сравнительно низкую производительность RubyVM, “слабые” библиотеки и что останется от хваленого Ruby?
Vadim
January 9th, 2008
Забавно читать на блоге “отчаянного PHP-шника” о руби
Yuriy Drozdov
January 9th, 2008
Vadim
Да, Dir.entries(‘path’) даст тот же перечень файлов. Но мне не нужны симлинки, мне не нужны “.” и “..”.
Последняя версия:
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
January 9th, 2008