Ruby 开发(九) - 文件 IO(上)

183 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

一、文件属性操作

Ruby 中 File 类中内嵌的一个 Stat 类可以实现对文件属性的操作,也可以实现对文件属性的访问,如文件操作权限、文件大小、文件时间戳等。需要注意的是 File::Stat 类下的部分方法并不适用在所有的操作系统上。

权限操作

File::Stat ;类的 mode 方法可以获取对文件的访问权限,File 类的 chmod 方法可以修改文件的权限。

# 文件权限

file = "readme.txt"
mode = File.stat(file).mode
puts "文件的访问权限代码为 #{mode}"

# 修改权限
File.chmod(01522, file)

mode = File.stat(file).mode
puts "修改之后文件的访问权限代码为 #{mode}"

在同级目录下新建一个 readme.txt 文件,执行上述代码,输出结果如下:

文件的访问权限代码为 33188
修改之后文件的访问权限代码为 33618

检查文件是否存在

在对文件进行读取和写入之前,首先要进行判断文件是否存在才能执行一些响应的操作。Ruby 中检查一个文件是否存在可以使用 FileTest 莫家中的模块方法 exist? 和 exists?方法来实现。

file = "readme.txt"
exist = FileTest.exist?(file)
exists = FileTest.exists?(file)

if (exist)
  puts "exist:文件 #{file} 存在"
else
  puts "exist:文件 #{file} 不存在"
end

if (exists)
  puts "exists:文件 #{file} 存在"
else
  puts "exists:文件 #{file} 不存在"
end

执行上述代码,输出结果如下:

exist:文件 readme.txt 存在
exists:文件 readme.txt 存在

查看文件大小

查看文件大小可以使用 FileTest 模块中的模块方法 size?、zero? 和 size 方法来实现,其中

  • size?: 访问文件大小,如果文件大小为 0,则返回 nil
  • zero?: 如果文件大小为0,返回 true,否则返回 false
  • size: 返回文件的实际大小
file = "readme.txt"
puts "size?" + FileTest.size?(file).to_s
puts "zero?" + FileTest.zero?(file).to_s
puts "size:" + FileTest.size(file).to_s

执行上述代码,输出结果如下:

size?20
zero?false
size:20

获取与设置文件戳

文件有三个与之相关的时间戳,分别为最后一次修改的时间、最后一次读取的时间和创建时间,对于这三个时间戳可以通过 File::Stat 类中的 mtime、atime 和 ctime 来访问,可以通过同名的类方法或者实例方法来获取。

File 类中提供的 utime 方法可以设置文件的最后一次访问时间和最后一次修改时间。

file = "readme.txt"

# 获取三个时间戳,使用类方法
mtime = File.mtime(file)
atime = File.atime(file)
ctime = File.ctime(file)

puts "修改前的时间戳:mtime=#{mtime}, atime=#{atime}, ctime=#{ctime}"

# 修改时间戳
File.utime(Time.now, Time.now, file)

# 再次获取和时间戳,使用实例方法
file_obj = File.new(file)
mtime = file_obj.mtime
atime = file_obj.atime
ctime = file_obj.ctime

puts "修改后的时间戳:mtime=#{mtime}, atime=#{atime}, ctime=#{ctime}"

执行上述代码,输出结果如下:

修改前的时间戳:mtime=2022-06-18 14:05:23 +0800, atime=2022-06-18 14:05:24 +0800, ctime=2022-06-18 14:05:23 +0800
修改后的时间戳:mtime=2022-06-18 14:05:35 +0800, atime=2022-06-18 14:05:35 +0800, ctime=2022-06-18 14:05:35 +0800

二、读取文件

使用 Ruby 读取文件首先要打开文件,之后再进行读取的操作,当然有打开就有关闭。

打开文件

Ruby 中打开文件的方式有 3 种

使用 File 类的 new 方法打开文件

在使用 File 类的 new 方法实例化一个对象的时候,需要指定文件作为参数,但是这种方式只能读取,如果需要进行其他操作需要传入第二个参数既操作模式,操作模式默认是 r 只读,除此之外还有其他几种操作模式

path = "readme.txt"

file = File.new(path, "r")
操作模式说明
r/r+只读模式打开文件,同时将文件指针放在文件的开始处
w/w+只写模式打开文件,打开文件后会见该文件内容清空后在写入指定的内容,如果文件不存在,则会自动创建该文件
a/a+追加模式打开文件,打开文件后将文件指针放在文件的结尾处,追加指定的内容,如果文件不存在则自动创建该文件
b二进制模式打开文件