Ruby Dir 类和方法

在 Ruby 中,Dir 类 是用于处理目录(文件夹)操作的核心类,提供了创建、遍历、删除目录以及管理文件系统路径等功能。Dir 类的方法主要以类方法形式存在,适合处理文件系统中的目录操作。以下是对 Ruby Dir 类及其方法的中文讲解,涵盖常见用法、方法及注意事项,力求简洁清晰。


1. Dir 类概述

Dir 类用于操作文件系统中的目录,例如列出目录内容、创建或删除目录、切换工作目录等。Dir 类的操作通常不涉及文件内容,而是专注于目录结构的管理。


2. 创建和打开目录

创建目录

使用 Dir.mkdir 创建目录。

Dir.mkdir("my_folder")  # 创建目录 my_folder
Dir.mkdir("path/to/nested", 0755)  # 创建嵌套目录,指定权限(Unix 系统)

说明

  • 0755 是 Unix 权限模式(用户读写执行,其他人读执行)。
  • 如果父目录不存在,需先创建父目录或使用 FileUtils.mkdir_p

打开目录

使用 Dir.openDir.new 打开目录,结合块(block)可自动关闭。

Dir.open("my_folder") do |dir|
  dir.each { |entry| puts entry }
end
# 输出:. .. file1.txt file2.txt(假设目录中有这些文件)

说明. 表示当前目录,.. 表示父目录。


3. Dir 类的实例方法

实例方法用于操作已打开的目录对象(Dir 实例)。

  • each:遍历目录中的条目(文件和子目录)。
  Dir.open("my_folder") do |dir|
    dir.each { |entry| puts entry }
  end
  # 输出:. .. file1.txt file2.txt
  • read:读取下一个条目。
  dir = Dir.new("my_folder")
  puts dir.read  # 输出:.
  puts dir.read  # 输出:..
  dir.close
  • rewind:重置目录指针到开头。
  dir = Dir.new("my_folder")
  dir.read
  dir.rewind
  puts dir.read  # 输出:.(重新开始)
  dir.close
  • close:关闭目录(块模式下自动关闭)。
  dir = Dir.new("my_folder")
  dir.close

4. Dir 类的类方法

类方法直接操作目录,无需创建 Dir 实例。

列出目录内容

  • Dir.entries(path):返回目录中所有条目(数组)。
  puts Dir.entries("my_folder")  # 输出:[".", "..", "file1.txt", "file2.txt"]
  • Dir.foreach(path):遍历目录条目。
  Dir.foreach("my_folder") { |entry| puts entry }
  # 输出:. .. file1.txt file2.txt
  • Dir.glob(pattern):按模式匹配文件/目录。
  puts Dir.glob("my_folder/*.txt")  # 输出:["my_folder/file1.txt", "my_folder/file2.txt"]
  puts Dir.glob("**/*.txt", File::FNM_DOTMATCH)  # 递归匹配所有 .txt 文件

模式说明

  • *:匹配任意字符(不含目录分隔符)。
  • **:递归匹配子目录。
  • File::FNM_DOTMATCH:包含隐藏文件(如 ...)。

目录管理

  • Dir.mkdir(path, permissions):创建目录。
  Dir.mkdir("new_folder")
  • Dir.rmdir(path)Dir.delete(path):删除空目录。
  Dir.rmdir("new_folder")
  • Dir.exist?(path):检查目录是否存在。
  puts Dir.exist?("my_folder")  # 输出:true(如果存在)

当前工作目录

  • Dir.pwdDir.getwd:获取当前工作目录。
  puts Dir.pwd  # 输出:/home/user/project(示例路径)
  • Dir.chdir(path):切换当前工作目录。
  Dir.chdir("my_folder")
  puts Dir.pwd  # 输出:/home/user/project/my_folder
  • Dir.home:获取用户主目录。
  puts Dir.home  # 输出:/home/user

临时目录

  • Dir.tmpdir:返回系统临时目录路径。
  puts Dir.tmpdir  # 输出:/tmp(或系统特定路径)

5. 异常处理

目录操作可能因权限不足、目录不存在等抛出异常,建议使用 rescue

begin
  Dir.open("nonexistent_folder") { |dir| dir.each { |e| puts e } }
rescue Errno::ENOENT
  puts "目录不存在!"
end
# 输出:目录不存在!

6. FileUtils 模块(扩展)

标准库 FileUtils 提供更高级的目录操作功能,需 require 'fileutils'

  • FileUtils.mkdir_p(path):递归创建目录(类似 mkdir -p)。
  require 'fileutils'
  FileUtils.mkdir_p("path/to/nested")
  • FileUtils.rm_r(path):递归删除目录及其内容。
  FileUtils.rm_r("my_folder")

7. 注意事项

  • 自动关闭:使用 Dir.open 带块方式,目录会自动关闭。
  • 手动关闭:不使用块时,需显式调用 dir.close
  dir = Dir.new("my_folder")
  dir.each { |e| puts e }
  dir.close
  • 路径分隔符:使用 File::SEPARATORFile.join 确保跨平台兼容。
  path = File.join("my_folder", "file.txt")  # 输出:my_folder/file.txt
  • 权限:确保有目录操作权限,否则抛出 Errno::EACCES
  • 隐藏文件Dir.entriesDir.foreach 默认包含 ...,需过滤。
  Dir.entries("my_folder").reject { |e| e.start_with?(".") }

8. 示例:综合应用

module DirUtils
  def self.list_files(path)
    Dir.glob("#{path}/*.txt").map { |f| File.basename(f) }
  end
end

# 创建目录并添加文件
Dir.mkdir("docs") unless Dir.exist?("docs")
File.write("docs/file1.txt", "Content 1")
File.write("docs/file2.txt", "Content 2")

# 列出 .txt 文件
puts DirUtils.list_files("docs")  # 输出:["file1.txt", "file2.txt"]

# 遍历目录
Dir.open("docs") do |dir|
  dir.each { |entry| puts entry unless entry.start_with?(".") }
end
# 输出:
# file1.txt
# file2.txt

# 切换目录并检查
Dir.chdir("docs") do
  puts Dir.pwd  # 输出:/home/user/project/docs(示例路径)
end

# 清理
require 'fileutils'
FileUtils.rm_r("docs")

9. 总结

Ruby 的 Dir 类提供了强大的目录操作功能,包括创建、遍历、删除目录及管理当前工作目录。常用方法如 Dir.entries, Dir.glob, Dir.mkdir 等简化了文件系统操作。结合 FileUtils 模块可实现更复杂的目录管理。注意异常处理、路径兼容性和权限问题,确保代码健壮和跨平台。

如果你有具体问题或需要更详细的示例,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注