2007/8/27, Rebhan, Gilbert <Gilbert.Rebhan / huk-coburg.de>:
>
>
>
> -----Original Message-----
> From: Robert Klemme [mailto:shortcutter / googlemail.com]
> Sent: Monday, August 27, 2007 9:01 AM
> To: ruby-talk ML
> Subject: Re: Dir, recursive filescan
>
> > files = Dir["E:/test/foobar/scripts/**/*.xml"]
> > matches = files.inject(0) {|sum,f| sum +
> File.read(f).scan('<if>').size}
> > printf "%10d matches\n%10d files\n", matches, files.size
> >
> > If you have a lot of files it may pay off to use Find.find instead of
> > Dir[].
> > */
> >
> > thanks, works like a charm :-)
> > Never used  the inject method until now, i'm still on newbie level.
>
> /*
> Took me a while, too. But if you get the hang of it you'll see it's a
> really cool utility.  At one point I rewrote all the Enumerable
> methods via #inject just for the learning experience. :-)
> */
>
> one thing i noticed when using Dir[...] on large dirtrees i.e. C:/ruby
> i get a Permission denied =
>
> filescan.rb:21:in `read': Permission denied - C:/ruby/doc/Expat-1.95.8
> (Errno::EACCES)
>
> I think that's the reason you mentioned to use Find.find yor large
> dirtrees ?!

Not exactly. My reasoning was that the Dir[] returns a large array
while Find invokes the block once per file found.

But your problem is related to error handling.  Dunno what Find does
here but the root cause of your issue is that you seem to not have
permissions for one of the directories.

Kind regards

robert