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                    `------------------------------'