SVX日記
2023-05-10(Wed) 再帰で悩みまくる
何度か書いたことはあるのだが、ちょっと難しいのは確か。こうなったら、回り道ではあるが、よく知っている構造についてまず書いてみて、それをベースにすればいいのではないか。と思い、ファイル/ディレクトリ構造を表示する、プログラムを書いてみた。
#!/usr/bin/ruby
def find(path)
entry = {
:type => false,
:name => path.last,
}
unless(FileTest.directory?(path.join('/')))
entry[:type] = 'file'
else
entry[:type] = 'dir'
entry[:entries] = []
Dir.open(path.join('/')).each {|e|
e =~ /^\./ and next
entry[:entries] << find(path + [e]) # 再帰
}
end
return(entry)
end
def show(entry, n = 0)
puts('%s%4s: %s' % ["\t" * n, entry[:type], entry[:name]])
if(entry[:type] == 'dir')
entry[:entries].each {|entry1|
show(entry1, n + 1) # 再帰
}
end
end
entry = find(['fileA'])
show(entry)
puts
entry = find(['dirB'])
show(entry)
$ ./recursive
file: fileA
dir: dirB
file: fileC
dir: dirD
file: fileE
file: fileF
file: fileG