Hi Robert,

Thanks for your reply, much appreciated! Firstly, I'm running the code 
on a Mac at the moment, hence the single root directory as your pointed 
out.

I'm not sure about the network drive situation...the script does seem to 
timeout and terminate once it reaches the folder '/net/'. I tried 
navigating into this folder and discovered two entries - 'broadcasthost' 
and 'localhost', both of which result in a timeout in the terminal 
window when I try to access them. I know this isn't really related to 
Ruby, but again any info people might have would be very appreciated.

Again, Robert, thanks for the info about not needing to chomp the 
returned string from the user when using it with the Find module.

Robert Klemme wrote:
> On 19.01.2008 22:53, Mike -- wrote:
>>   from /usr/local/lib/ruby/1.8/find.rb:43:in `find'
>>   from /usr/local/lib/ruby/1.8/find.rb:38:in `catch'
>>   from /usr/local/lib/ruby/1.8/find.rb:38:in `find'
>>   from ruby_find3.rb:10
>> 
>> I'm a little confused as to why it would timeout if it's simply
>> traversing the local directory tree? I would be grateful if anyone would
>> be able to give any assistance - I'm sure it's probably a simple fix!
> 
>  From what you write I assume you are on a Unix style operating system
> (single root directory).  As the stack trace seems to reveal there is
> some network communication going on ("/net/broadcasthost").  Apparently
> there are some network drives mounted.  Since you start in the root
> directory they will be visited eventually.  You can check with "mount"
> or "df" what file systems are mounted on your system.

I'm not sure about the network drive situation...the script does seem to 
timeout and terminate once it reaches the folder '/net/'. I tried 
navigating into this folder and discovered two entries - 'broadcasthost' 
and 'localhost', both of which result in a timeout in the terminal 
window when I try to access them. I know this isn't really related to 
Ruby, but again any info people might have would be very appreciated.

> 
>> path = gets.chomp
>> 
>>       # Ignore directories beginning with "."
> 
> This is completely superfluous because Find.find takes care of that (if
> it would not it would *always* enter an infinite loop).

Again, Robert, thanks for the info about not needing to chomp the 
returned string from the user when using it with the Find module.
> 
>>       elsif File.basename(p)[0] == ?.
>>         Find.prune
>>       end
>>     end
>> 
>>     if FileTest.file?(p)
>>       if (File.basename(p) =~ search_exp)
>>         puts File.basename(p) + " : " + File.expand_path(p)
>>       elseif
>>         Find.prune
> 
> Why do you prune here?  What this basically means is that traversal will
> stop on every directory that contains at least one file name that does
> not match your regexp.  Is this really what you want?

Yea, I think I know what you mean. No need for it really. I was playing 
with something I saw on another web page whereby the programmer was 
telling the Find script not to bother looking into Mac folders that 
began with a '.', and I guess I just didn't think to remove it.
> 
>>       end
>>     end
>>   end
>> rescue SystemCallError
>>   puts "Timeout error :S"
>> end
>> 
>> puts "<<-- End of Search -->"
> 
> Is this really the exact code that produced the error you present above?
>    I ask because you do not print out the exception itself but rather
> the fixed string "Timeout error :S".

Yep, that's the exact code I was using at the time of posting. I haven't 
gotten round to finding out how to print out the details of the 
exception so I just got it to tell me if an error occurred. I figured

> 
> Some additional remarks: I usually try to avoid local variable 'p'
> because of the method 'p' (print out #inspect string of an object) which
> I frequently use for debugging.
> 
> You can make your code a bit more efficient by not repeating tasks,
> namely the basename extraction.
> 
> This is how I would probably do it - assuming you want to find all files
> and directories where the basename matches the given regexp.
> 
> require 'find'
> dir = ARGV.shift or raise "Need a directory name"
> rx = Regexp.new((ARGV.shift or raise "Need a regexp"),
>    Regexp::IGNORECASE)
> 
> Find.find dir do |f|
>    if rx =~ File.basename(f)
>      print File.directory?(f) ? "Dir : " : "File: ", f, "\n"
>    end
> end

I hate you. You've managed to take my 30something lines and make 
reproduce it in 10. Thanks, good for me to see this sort of thing in 
action so I can learn from it. Although I'm not running my code from the 
command line so I wouldn't use the ARGV commands, but again good to know 
about them. I do appreciate the help, I'm still at novice level of 
programming so it's always good to see "best practice" code.

 I reproduced the same code in Perl to perform the same search function 
which didn't produce the same search error, so I guess that Perl does 
not have an issue with the network mounts? Also, the Perl code seemed to 
return significantly more results from the search when performed on my 
Vista machine (used alongside the Ruby code), which seemed odd to me? 
Not a huge issue, but still...

Thanks, all the best,

Mike

> 
> Kind regards
> 
>   robert

-- 
Posted via http://www.ruby-forum.com/.