Dir 是 Ruby 提供的用于操作文件系统目录的核心类之一。它允许开发者列出、创建、删除、遍历目录中的文件,并与 File 类结合进行高级文件操作。本文将详细介绍 Dir 的主要方法,并提供示例代码。


📌 目录

  1. 🔹 Dir 类概述
  2. 🔹 Dir 的常用方法
  3. 🔹 Dir 方法的应用示例
  4. 🔹 DirFile 结合使用
  5. 🔹 结论
  6. 🔹 参考资料

🔹 Dir 类概述

Dir 类用于管理目录,它提供了多种方法来读取目录内容、更改当前目录、创建/删除目录等。

在 Ruby 中,DirEnumerable 模块的一部分,因此可以使用 eachmap 等方法来遍历目录内容。


🔹 Dir 的常用方法

📂 读取目录内容

Dir.entries(path)

获取目录 path 下的所有文件和子目录(包含 ...)。

puts Dir.entries(".")
# 输出:
# [".", "..", "file1.txt", "script.rb", "subdir"]

Dir.foreach(path) { |file| block }

遍历目录,并对每个文件执行代码块。

Dir.foreach(".") do |file|
  puts file
end

Dir.glob(pattern, flags)

返回匹配 pattern 的文件列表(支持通配符)。

puts Dir.glob("*.rb")  # 只列出 .rb 文件
puts Dir.glob("**/*.rb")  # 递归列出所有子目录的 .rb 文件
puts Dir.glob("{*.rb,*.txt}")  # 匹配 .rb 和 .txt 文件


📂 目录操作

Dir.pwd / Dir.getwd

获取当前工作目录。

puts Dir.pwd  # 例如: /home/user/project

Dir.chdir(path)

切换当前工作目录。

Dir.chdir("/tmp")
puts Dir.pwd  # /tmp

Dir.mkdir(path [, mode])

创建目录(可选 mode 参数设置权限)。

Dir.mkdir("new_folder")

Dir.rmdir(path)

删除空目录。

Dir.rmdir("new_folder")


📂 迭代目录

Dir.open(path) { |dir| block }

打开目录并返回 Dir 对象,可用于遍历文件。

Dir.open(".") do |dir|
  dir.each { |file| puts file }
end

Dir.new(path)

创建 Dir 对象,不使用代码块时可手动遍历目录。

d = Dir.new(".")
puts d.path  # 打印目录路径
d.each { |file| puts file }


📂 删除目录及文件

File.delete(filename)

删除文件,而非目录。

File.delete("file1.txt")

FileUtils.rm_rf(path)

递归删除目录及其内容(需 require 'fileutils')。

require 'fileutils'
FileUtils.rm_rf("directory_name")


🔹 Dir 方法的应用示例

📌 递归遍历目录并打印所有文件

def list_files(path)
  Dir.glob("#{path}/**/*").each do |file|
    puts file
  end
end

list_files(".")  # 列出当前目录及所有子目录的文件

📌 查找特定类型的文件

Dir.glob("**/*.rb").each do |file|
  puts "找到 Ruby 文件: #{file}"
end

📌 删除非空目录

require 'fileutils'
FileUtils.rm_rf("test_folder")


🔹 DirFile 结合使用

通常,我们会结合 File 类来执行更复杂的操作,如获取文件大小、修改时间等。

Dir.glob("*.rb").each do |file|
  puts "文件: #{file}, 大小: #{File.size(file)} bytes"
end


🔹 结论

  • Dir 提供了目录操作的基础方法,包括列出、创建、删除目录。
  • Dir.glob 是最强大的目录搜索方法,支持通配符匹配。
  • 结合 File 类,可以执行更高级的文件管理操作,如文件属性获取、文件删除等。

Ruby Dir 类提供了强大且直观的 API,使得目录管理变得高效便捷。


🔹 参考资料