filesystem/walking_a_directory_no_parens.rb

tests/_examples/filesystem/walking_a_directory_no_parens.rb in the metorex repository.

# An open directory is walked one name at a time, and the position it is left
# at decides what the next read finds.
folder = File.join Dir.pwd, "tmp_walking_no_parens"
Dir.mkdir folder
File.write(File.join(folder, "one.txt"), "1")
File.write(File.join(folder, "two.txt"), "2")
Dir.mkdir(File.join(folder, "inside"))

opened = Dir.open folder
p opened.class
p opened.path == folder
p opened.to_path == folder
p opened.inspect == "#<Dir:" + folder + ">"
p opened.closed?
p Dir.include? Enumerable

p opened.pos
first = opened.read
p first.class
p opened.pos
opened.rewind
p opened.pos
p opened.read == first

# A position taken before a read leads back to the same name.
mark = opened.pos
before = opened.read
opened.seek mark
p opened.read == before

p opened.entries.sort
p opened.children.sort

walked = []
opened.each { |name| walked.push(name) }
p walked.sort
p opened.read

collected = []
opened.each_child { |name| collected.push(name) }
p collected.sort

p opened.close
p opened.closed?
p opened.path == folder

begin
  opened.read
rescue IOError => problem
  p problem.message
end

# Reading the whole directory at once needs no handle.
p Dir.entries(folder).sort
p Dir.children(folder).sort
p Dir.exist? folder

Dir.open(folder) { |held| p held.children.length }

File.delete(File.join(folder, "one.txt"), File.join(folder, "two.txt"))
Dir.rmdir(File.join(folder, "inside"))
Dir.rmdir folder
p Dir.exist? folder

Output:

Dir
true
true
true
false
true
0
String
1
0
true
true
[".", "..", "inside", "one.txt", "two.txt"]
["inside", "one.txt", "two.txt"]
[".", "..", "inside", "one.txt", "two.txt"]
nil
["inside", "one.txt", "two.txt"]
nil
true
true
"closed directory"
[".", "..", "inside", "one.txt", "two.txt"]
["inside", "one.txt", "two.txt"]
true
3
false