Ruby File I/O

Reading Files

File reading patterns
content = File.read("/etc/hostname")
lines = File.readlines("/etc/resolv.conf", chomp: true)

# Block form (auto-closes)
File.open("/var/log/syslog") do |f|
  f.each_line do |line|
    puts line if line.include?("error")
  end
end

# First N lines
File.foreach("/var/log/auth.log").first(10).each { |l| puts l }

Writing Files

File writing patterns
File.write("/tmp/hosts.txt", "vault-01\nise-01\n")
File.write("/tmp/scan.log", "#{Time.now} done\n", mode: "a")  # append

File.open("/tmp/report.csv", "w") do |f|
  f.puts "hostname,ip,status"
  devices.each { |d| f.puts "#{d.hostname},#{d.ip},#{d.status}" }
end

File Operations

Metadata and path manipulation
File.exist?("/etc/hosts")
File.file?("/etc/hosts")
File.directory?("/etc")
File.size("/var/log/syslog")
File.mtime("/etc/hosts")

File.basename("/etc/ssl/certs/ca.pem")   # => "ca.pem"
File.dirname("/etc/ssl/certs/ca.pem")    # => "/etc/ssl/certs"
File.extname("config.yml")              # => ".yml"
File.expand_path("~/atelier")
File.join("etc", "ssl", "certs")        # => "etc/ssl/certs"
Directory operations
require "fileutils"

Dir.glob("/etc/ssl/**/*.pem")
Dir["/var/log/*.log"]

FileUtils.mkdir_p("/tmp/reports/2026/04")
FileUtils.cp("src.conf", "dst.conf")
FileUtils.rm_rf("/tmp/stale_cache")

Dir.mktmpdir("scan-") do |tmpdir|
  File.write("#{tmpdir}/results.json", data.to_json)
end

CSV and JSON

Structured data I/O
require "csv"
CSV.foreach("/tmp/devices.csv", headers: true) do |row|
  puts "#{row['hostname']} => #{row['ip']}"
end

require "json"
data = JSON.parse(File.read("config.json"), symbolize_names: true)
File.write("output.json", JSON.pretty_generate(data))

IO and Streams

External commands
output = `hostname -f`.strip
success = system("ping -c 1 10.50.1.1")

require "open3"
stdout, stderr, status = Open3.capture3("openssl version")
puts stdout if status.success?

IO.popen("grep -c error /var/log/syslog") do |io|
  count = io.read.strip.to_i
end