Hello all,
I’ve been working on a class+script to crawl through my directories and
thought I had it working just right, when it crashed some 13 minutes
into
running. I included the stack at the bottom, in case it gives a better
hint to anyone here.
The code where it fails is this method - the if checks fail to see that
filename is a file, and even errors out on the else’s
File.ftype(filename)
call:
def get_dir_info_recursive change_into_dir, write_to_file,
put_in_container
Dir.chdir( change_into_dir )
Dir.foreach(".") {|filename|
if File.directory?(filename) then
# write_to_file.puts stuff
# … recursively call this method
elsif File.file?(filename) then
# write_to_file.puts stuff
# … simple gather info and add to collection
else
puts “ERROR: TYPE=#{File.ftype(filename)} for #{filename} in
#{put_in_container.path}”
end
}
Dir.chdir(’…’)
end
My problem solving skills came up with a few alternatives:
-
Maybe the filename/directory path is too long. After all the path +
filename end up being right about 255 characters long.
NOPE: Tried starting the loop right in the directory where the file
errors out, even at earlier directories, the error doesn’t happen -
the file is correctly identified as a file! -
Maybe there’s a problem with the output file? It is 11_892_316 bytes
at the error.
NOPE: Used irb to append another several k to the file with seek
then
putc - no problem there. -
Is there a hidden runtime problem?
RAM consumption? NOPE, I’ve run the script on larger, though not
deeper directories without it crashing. Though I would like to know
how to set the RAM usage. Anyone?Stack problems? NOT purely stack level: simple recursive program
bombs at level 760 with ‘stack level too deep’.
Other stack problems? Alternating recursion with each loops?
Maybe, since 20 directories deep causing 50+ levels in the stack.
And I am making either 1 or 2 new objects per call.Ruby + NTFS + WinXP = ?occasional problem?
Any help and ideas are much appreciated.
Thanks,
-Chris
Try #1: IF file? ELSE treat it as a directory
Starting file fdata_Q Mon Feb 06 22:40:22 Central Standard Time 2006
drive7.rb:118:in chdir': Invalid argument - _EJSRemoteStatelessCrystalItemReconControllerHome_Tie.java (Errno::EINVAL) ... ... 55 levels... ... Try #2 with drive8: do directory? THEN file? THEN try printing File.ftype: C:\CHRIS\ruby\MyFiles>ruby drive8.rb Q Starting file fdata_Q Mon Feb 06 23:45:27 Central Standard Time 2006 Finished file fdata_Q Mon Feb 06 23:58:37 Central Standard Time 2006 drive8.rb:139:in
ftype’: No such file or directory -
_EJSRemoteStatelessCrystalItemReconControllerHome_Tie.java (Errno:
:ENOENT)
from drive8.rb:139:in get_dir_info_recursive' from drive8.rb:122:in
foreach’
from drive8.rb:122:in get_dir_info_recursive' from drive8.rb:128:in
get_dir_info_recursive’
from drive8.rb:122:in foreach' from drive8.rb:122:in
get_dir_info_recursive’
from drive8.rb:128:in get_dir_info_recursive' from drive8.rb:122:in
foreach’
… 54 levels…
from drive8.rb:122:in get_dir_info_recursive' from drive8.rb:163 from drive8.rb:148:in
each’
from drive8.rb:148