Neil Conway <nconway / klamath.dyndns.org> wrote: > Hi all, > > I'm still a Ruby-newbie, so if this is silly, just tell me. > > I'm using Dir#each to recurse through the files in a directory. > To me, the following code is fairly natural: Better than Dir[]/Dir.glob since it actually includes all files :) > ##### > #examines the specified file; if it is valid, it adds the file > #to the specified array > def process_file(file, array) > #checks on each file > return unless File.exists?(file) > return unless File.readable?(file) > #checks on directories: recurse, or just ignore them > if (File.directory?(file)) > return unless $RECURSIVE > dir = Dir.new(file) > dir.each {|f| process_file(f, array) } dir.each {|f| process_file(f, array) if f !~ /^\.\.?$/} dir.each {|f| process_file(f, array) if [".", ".."].include?(f)} etc. > end > #okay, the file has passed all the tests, so add it to the array > array.push(file) > end > ##### > > ($RECURSIVE is a boolean global variable). > > The problem with this is that Dir#each includes "." (and ".."). So > this code goes into an infinite loop, and eventually causes a > "too many open files" error. To avoid this, I suppose I'd need > to do some checking for special cases, and ignore "." and ".." -- > except this seems kinda clumsy to me. I think that another > method for Dir would be justified: like #each, except it doesn't > include "." and ".." > > Call it Dir#all_files or something... > > Does anyone else think this would be a good idea? Or is there > a better way to solve my problem? I, personally, feel this should just be accounted for in the code in the simplest way possible (like one of my suggestions above). I don't think it would be very wise to introduce more Enumerable-type interfaces than one to a single class -- but perhaps in this case, Dir.new could take a "flags" argument that allowed you to disable displaying of the two self/ parent-referential entries. > Thanks in advance, > > Neil Hope I've helped :) -- Brian Fundakowski Feldman \ FreeBSD: The Power to Serve! / green / FreeBSD.org `------------------------------'