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
模块可实现更复杂的目录管理。注意异常处理、路径兼容性和权限问题,确保代码健壮和跨平台。
如果你有具体问题或需要更详细的示例,请告诉我!