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.open 或 Dir.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.pwd或Dir.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::SEPARATOR或File.join确保跨平台兼容。
path = File.join("my_folder", "file.txt") # 输出:my_folder/file.txt
- 权限:确保有目录操作权限,否则抛出
Errno::EACCES。 - 隐藏文件:
Dir.entries和Dir.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 模块可实现更复杂的目录管理。注意异常处理、路径兼容性和权限问题,确保代码健壮和跨平台。
如果你有具体问题或需要更详细的示例,请告诉我!