Files and Directories
Directory Listing
Ruby can create a directory and list entries in a deterministic order.
directory listing
Sorting directory entries makes output stable and easier to compare.
Directory Listing
directory_listing.rb
Replay: real traced execution (multi-file project)
require "tmpdir"
extra_file = "todo.txt"
Dir.mktmpdir do |dir|
project_dir = File.join(dir, "project")
Dir.mkdir(project_dir)
File.write(File.join(project_dir, "readme.txt"), "readme\n")
File.write(File.join(project_dir, extra_file), "item\n")
entries = Dir.children(project_dir).sort
puts "directory=#{File.basename(project_dir)}"
puts "entries=#{entries.join(",")}"
puts "count=#{entries.length}"
end
require "tmpdir"
extra_file = "done.txt"
Dir.mktmpdir do |dir|
project_dir = File.join(dir, "project")
Dir.mkdir(project_dir)
File.write(File.join(project_dir, "readme.txt"), "readme\n")
File.write(File.join(project_dir, extra_file), "item\n")
entries = Dir.children(project_dir).sort
puts "directory=#{File.basename(project_dir)}"
puts "entries=#{entries.join(",")}"
puts "count=#{entries.length}"
end
require "tmpdir"
extra_file = "notes.md"
Dir.mktmpdir do |dir|
project_dir = File.join(dir, "project")
Dir.mkdir(project_dir)
File.write(File.join(project_dir, "readme.txt"), "readme\n")
File.write(File.join(project_dir, extra_file), "item\n")
entries = Dir.children(project_dir).sort
puts "directory=#{File.basename(project_dir)}"
puts "entries=#{entries.join(",")}"
puts "count=#{entries.length}"
end
extra_file ← todo.txt
1require "tmpdir"23extra_file→ todo.txt = "todo.txt" #@extra_file="done.txt", "notes.md"45Dir.mktmpdir do |dir|6 project_dir = File.join(dir, "project")7 Dir.mkdir(project_dir)89 File.write(File.join(project_dir, "readme.txt"), "readme\n")10 File.write(File.join(project_dir, extra_file), "item\n")1112 entries = Dir.children(project_dir).sort1314 puts "directory=#{File.basename(project_dir)}"15 puts "entries=#{entries.join(",")}"16 puts "count=#{entries.length}"17endproject_dir ← /tmp/⟨tmp A⟩/project, entries ← ["readme.txt", "todo.txt"]
5Dir.mktmpdir do |dir/tmp/⟨tmp A⟩|6 project_dir→ /tmp/⟨tmp A⟩/project = File.join(dir, "project")/tmp/⟨tmp A⟩/project7 Dir.mkdir(project_dir/tmp/⟨tmp A⟩/project)89 File.write(File.join(project_dir, "readme.txt")/tmp/⟨tmp A⟩/project/readme.txt, "readme\n")10 File.write(File.join(project_dir, extra_file)/tmp/⟨tmp A⟩/project/todo.txt, "item\n")1112 entries→ ["readme.txt", "todo.txt"] = Dir.children(project_dir).sort["readme.txt", "todo.txt"]1314 puts "directory=#{File.basename(project_dir)project}"15 puts "entries=#{entries.join(",")readme.txt,todo.txt}"16 puts "count=#{entries.length2}"17endoutputdirectory=project entries=readme.txt,todo.txt count=2
extra_file ← done.txt
1require "tmpdir"23extra_file→ done.txt = "done.txt"45Dir.mktmpdir do |dir|6 project_dir = File.join(dir, "project")7 Dir.mkdir(project_dir)89 File.write(File.join(project_dir, "readme.txt"), "readme\n")10 File.write(File.join(project_dir, extra_file), "item\n")1112 entries = Dir.children(project_dir).sort1314 puts "directory=#{File.basename(project_dir)}"15 puts "entries=#{entries.join(",")}"16 puts "count=#{entries.length}"17endproject_dir ← /tmp/⟨tmp A⟩/project, entries ← ["done.txt", "readme.txt"]
5Dir.mktmpdir do |dir/tmp/⟨tmp A⟩|6 project_dir→ /tmp/⟨tmp A⟩/project = File.join(dir, "project")/tmp/⟨tmp A⟩/project7 Dir.mkdir(project_dir/tmp/⟨tmp A⟩/project)89 File.write(File.join(project_dir, "readme.txt")/tmp/⟨tmp A⟩/project/readme.txt, "readme\n")10 File.write(File.join(project_dir, extra_file)/tmp/⟨tmp A⟩/project/done.txt, "item\n")1112 entries→ ["done.txt", "readme.txt"] = Dir.children(project_dir).sort["done.txt", "readme.txt"]1314 puts "directory=#{File.basename(project_dir)project}"15 puts "entries=#{entries.join(",")done.txt,readme.txt}"16 puts "count=#{entries.length2}"17endoutputdirectory=project entries=done.txt,readme.txt count=2
extra_file ← notes.md
1require "tmpdir"23extra_file→ notes.md = "notes.md"45Dir.mktmpdir do |dir|6 project_dir = File.join(dir, "project")7 Dir.mkdir(project_dir)89 File.write(File.join(project_dir, "readme.txt"), "readme\n")10 File.write(File.join(project_dir, extra_file), "item\n")1112 entries = Dir.children(project_dir).sort1314 puts "directory=#{File.basename(project_dir)}"15 puts "entries=#{entries.join(",")}"16 puts "count=#{entries.length}"17endproject_dir ← /tmp/⟨tmp A⟩/project, entries ← ["notes.md", "readme.txt"]
5Dir.mktmpdir do |dir/tmp/⟨tmp A⟩|6 project_dir→ /tmp/⟨tmp A⟩/project = File.join(dir, "project")/tmp/⟨tmp A⟩/project7 Dir.mkdir(project_dir/tmp/⟨tmp A⟩/project)89 File.write(File.join(project_dir, "readme.txt")/tmp/⟨tmp A⟩/project/readme.txt, "readme\n")10 File.write(File.join(project_dir, extra_file)/tmp/⟨tmp A⟩/project/notes.md, "item\n")1112 entries→ ["notes.md", "readme.txt"] = Dir.children(project_dir).sort["notes.md", "readme.txt"]1314 puts "directory=#{File.basename(project_dir)project}"15 puts "entries=#{entries.join(",")notes.md,readme.txt}"16 puts "count=#{entries.length2}"17endoutputdirectory=project entries=notes.md,readme.txt count=2