1. File 类概述

  • File:用于操作文件系统中的文件,提供读写、创建、删除等功能。
  • 静态方法:直接通过 File 调用(如 File.read)。
  • 实例方法:通过 File 对象的实例调用(如 file.read)。
  • 依赖:无需额外引入,Ruby 核心库已包含。

2. 文件打开模式

File.openFile.new 支持以下模式:

模式说明
r只读(默认,从头开始)
w只写(覆盖文件)
a追加写(从末尾添加)
r+读写(从头开始)
w+读写(覆盖文件)
a+读写(从末尾添加)

3. 常用静态方法

File.read

读取整个文件内容:

content = File.read("example.txt")
puts content
# 假设 example.txt 内容为:
# 你好
# 世界
# 输出:
# 你好
# 世界

File.write

写入文件(覆盖模式):

File.write("output.txt", "你好,Ruby!")
# 文件内容:你好,Ruby!

File.foreach

逐行读取文件:

File.foreach("example.txt") do |line|
  puts "行:#{line.chomp}"
end
# 输出:
# 行:你好
# 行:世界

File.readlines

读取所有行到数组:

lines = File.readlines("example.txt", chomp: true)
puts lines  # ["你好", "世界"]

File.exist?

检查文件是否存在:

puts File.exist?("example.txt")  # true(假设文件存在)
puts File.exist?("missing.txt")  # false

File.delete

删除文件:

File.delete("output.txt") if File.exist?("output.txt")
puts "文件已删除"

File.size

获取文件大小(字节):

puts File.size("example.txt")  # 10(假设 "你好\n世界",中文占 3 字节/字)

File.mtime

获取文件修改时间:

puts File.mtime("example.txt")  # 2025-03-22 10:15:30 +0800(示例)

4. 使用 File.open(实例方法)

基本用法

用块方式打开文件(自动关闭):

File.open("example.txt", "r") do |file|
  puts file.read
end
# 输出:
# 你好
# 世界

手动打开和关闭

file = File.new("example.txt", "r")
puts file.read
file.close

写入文件

File.open("output.txt", "w") do |file|
  file.write("你好,")
  file.puts("世界!")  # puts 自动添加换行
end
# 文件内容:
# 你好,世界!

追加写入

File.open("output.txt", "a") do |file|
  file.puts "新的一行"
end
# 文件内容变为:
# 你好,世界!
# 新的一行

5. 实例方法

File 对象上调用:

read

读取全部内容:

File.open("example.txt", "r") do |file|
  puts file.read
end

gets

读取一行:

File.open("example.txt", "r") do |file|
  puts file.gets  # 你好
end

each_line

逐行迭代:

File.open("example.txt", "r") do |file|
  file.each_line { |line| puts "行:#{line.chomp}" }
end
# 输出:
# 行:你好
# 行:世界

posseek

控制文件指针:

File.open("example.txt", "r") do |file|
  puts file.pos      # 0(初始位置)
  file.seek(3)       # 移动到第 3 字节(跳过 "你")
  puts file.read     # 好\n世界
end

eof?

检查是否到达文件末尾:

File.open("example.txt", "r") do |file|
  until file.eof?
    puts file.gets
  end
end
# 输出:
# 你好
# 世界

6. 文件属性与管理

File.file?

检查是否为普通文件:

puts File.file?("example.txt")  # true
puts File.file?("dir")          # false

File.directory?

检查是否为目录:

puts File.directory?("dir")     # true(假设 dir 存在)
puts File.directory?("example.txt")  # false

File.readable? / writable? / executable?

检查权限:

puts File.readable?("example.txt")   # true
puts File.writable?("example.txt")   # true
puts File.executable?("example.txt") # false

File.rename

重命名文件:

File.rename("output.txt", "new_output.txt")
puts "文件已重命名"

File.join

拼接路径:

path = File.join("path", "to", "file.txt")
puts path  # path/to/file.txt

7. 中文支持示例

写入中文文件

File.open("greeting.txt", "w:UTF-8") do |file|
  file.puts "你好,世界!"
  file.puts "今天是 #{Time.now.strftime("%Y年%m月%d日")}"
end
# 文件内容:
# 你好,世界!
# 今天是 2025年03月22日

读取中文文件

File.foreach("greeting.txt", encoding: "UTF-8") do |line|
  puts "读取:#{line.chomp}"
end
# 输出:
# 读取:你好,世界!
# 读取:今天是 2025年03月22日

8. 实践案例

案例 1:日志记录器

class Logger
  def initialize(filename)
    @filename = filename
  end

  def log(message)
    File.open(@filename, "a") do |file|
      file.puts "[#{Time.now}] #{message}"
    end
  end
end

logger = Logger.new("log.txt")
logger.log("程序启动")
# log.txt 内容(示例):
# [2025-03-22 10:15:30 +0800] 程序启动

案例 2:文件复制

def copy_file(source, destination)
  if File.exist?(source)
    File.write(destination, File.read(source))
    puts "复制成功"
  else
    puts "源文件不存在"
  end
end

copy_file("example.txt", "example_copy.txt")

案例 3:逐行处理大文件

def count_lines(filename)
  count = 0
  File.foreach(filename) { count += 1 }
  count
end

puts "行数:#{count_lines("example.txt")}"  # 行数:2(假设两行)

9. 注意事项

  • 编码:处理中文时指定 encoding: "UTF-8",避免乱码:
  File.read("example.txt", encoding: "UTF-8")
  • 资源管理:用块形式(如 File.open ... do)自动关闭文件,避免手动 close
  • 异常处理:文件操作可能抛出异常(如 Errno::ENOENT),建议用 begin ... rescue
  begin
    File.read("missing.txt")
  rescue Errno::ENOENT
    puts "文件不存在"
  end

下一步

  • 练习:告诉我你想用 File 类做什么(读写、复制等),我可以设计一个例子。
  • 问题解答:对 File 类用法有疑问吗?直接问我!
  • 深入学习:想了解 IO 类、文件流或与网络结合吗?我可以继续讲解。

你现在想做什么?写代码、问问题,还是其他?