GGistDev

File I/O in Ruby

Read and write files safely with block forms and explicit encodings.

Quick read/write

Convenience methods handle whole files.

content = File.read("notes.txt", mode: "r:utf-8")
File.write("out.txt", "hello\n", mode: "w:utf-8")

Open with a block

Blocks auto-close files even on exceptions.

File.open("log.txt", "a:utf-8") do |f|
  f.puts("started at #{Time.now}")
end

Modes and encodings

Common modes: "r" read, "w" write (truncate), "a" append, plus "b" binary and ":encoding".

File.open("data.bin", "wb") { |f| f.write("\x00\x01") }

Line-by-line streaming

Stream files to avoid loading into memory.

File.foreach("big.csv", encoding: "UTF-8") do |line|
  cols = line.strip.split(",")
  # process cols
end

Tempfiles and atomic writes

Use Tempfile for safe scratch files; write atomically by writing to a temp file and renaming.

require 'tempfile'
Tempfile.create(['report', '.txt']) do |tmp|
  tmp.puts("data")
  tmp.flush
  File.rename(tmp.path, "final.txt")
end

Paths and directories

Use File and Dir utilities; prefer File.join for cross‑platform paths.

File.exist?("path")
File.directory?("/tmp")
File.join("/tmp", "file.txt")
Dir.children(".")
Dir.glob("**/*.rb")

Permissions and metadata

File.chmod(0o644, "out.txt")
File.mtime("out.txt")

Summary

  • Prefer block forms to ensure files are closed
  • Specify mode/encoding explicitly; stream large files line-by-line
  • Use Tempfile and atomic rename for safe writes