Files, Directories and I/O

31.1 Reading and Writing Files

Read (default) Write (truncate/create) "r+" / "w+" / "a+" Binary (e.g., "rb")

Exclusive create (fail if the file exists)

File.write("notes.txt", "Hello\n")                  # overwrite
File.write("notes.txt", "More\n", mode: "a")        # append
content = File.read("notes.txt")
lines = File.readlines("notes.txt", chomp: true)
File.foreach("big.log") { |line| process(line) }    # line by line (memory-efficient)

File.open("data.txt", "w") do |f|                   # block form auto-closes
  f.puts "line 1"
  f.write "line 2\n"
  f.printf("%05d\n", 42)
end

File.open("data.txt") do |f|
  f.each_line.with_index(1) { |line, n| puts "#{n}: #{line}" }
end

File.binread("image.png"); File.binwrite("copy.png", data)

31.2 File and Directory Operations

File.exist?("x.txt"); File.file?("x"); File.directory?("lib")
File.size("x.txt"); File.mtime("x.txt"); File.extname("a.rb"); File.basename("/a/b.rb", ".rb")
File.dirname("/a/b.rb"); File.join("dir", "file.txt"); File.expand_path("~/docs")
File.rename("a", "b"); File.delete("b"); File.chmod(0644, "f")

Dir.mkdir("out") unless Dir.exist?("out")
Dir.glob("**/*.rb").each { |f| puts f }
Dir.children("."); Dir.each_child(".") { }
Dir.pwd; Dir.chdir("lib") { puts Dir.pwd }
Dir.mktmpdir { |dir| }                      # require "tmpdir"

require "fileutils"
FileUtils.mkdir_p("a/b/c"); FileUtils.cp_r("src", "backup"); FileUtils.rm_rf("tmp")
FileUtils.mv("a.txt", "archive/"); FileUtils.touch("f")

require "pathname"
path = Pathname.new("lib") / "models" / "user.rb"
path.exist?; path.extname; path.dirname; path.read; path.children
Pathname.glob("**/*.md")

require "tempfile"
Tempfile.create("report") { |f| f.write("tmp"); f.path }

31.3 Standard Streams and IO

$stdin.each_line { |line| puts line.upcase }       # filter: `cat file | ruby script.rb`
ARGF.each_line { |l| }                             # reads files from ARGV or stdin
input = $stdin.read
$stderr.puts "error"
STDOUT.sync = true
require "io/console"
password = $stdin.getpass("Password: ")
IO.popen(["ls", "-la"]) { |io| puts io.read }
require "stringio"
buffer = StringIO.new; buffer.puts "in memory"; buffer.string