章节索引 :

Ruby 的 File 类

本章将详细介绍如何在 Ruby 中创建,打开以及读取和写入文件。然后,我们将学习如何删除和重命名文件。

1. 使用 Ruby 创建一个文件

使用 File 类的 new 方法在 Ruby 中创建新文件。新方法接受两个参数,第一个是要创建的文件的名称,第二个是打开文件的模式。下表显示了受支持的文件模式。

模式 时机简介(调用的时机)
r 只读访问。指针位于文件的开头。
r+ 读写访问。指针位于文件的开头。
w 只写访问。指针位于文件的开头。
w+ 读写访问。指针位于文件的开头。
a 只写访问。指针位于文件末尾
a+ 读写访问。指针位于文件末尾
b 二进制文件模式。与以上模式结合使用。仅Windows / DOS

结合以上信息,我们在只写模式下创建一个新文件。

实例:

File.new("temp.txt", "w")
=> #<File:temp.txt>

2. 打开现有文件

可以使用 File 类的 open 方法打开现有文件:

实例:

file = File.open("temp.txt")
=> #<File:temp.txt>

请注意,可用上表概述的不同模式打开现有文件。例如,我们可以以只读模式打开文件:

file = File.open("temp.txt", "r")
=> #<File:temp.txt>

还可以使用 closed?来确定文件是否已经打开:

file.closed?
=> false

最后,我们可以使用 Ruby File 类的 close 方法关闭文件:

file = File.open("temp.txt", "r")
=> #<File:temp.txt>
file.close
=> nil

3. 在 Ruby 中重命名和删除文件

在 Ruby 中,分别使用 renamedelete 方法来重命名和删除文件。例如,我们可以创建一个新文件,重命名然后删除它。

File.new("tempfile.txt", "w")
=> #<File:tempfile.txt>

File.rename("tempfile.txt", "newfile.txt")
=> 0

File.delete("newfile.txt")
=> 1

4. 获取有关文件的信息

文件处理通常不仅仅需要打开文件。有时有必要在打开文件之前先找到有关文件的信息。File类为此目的提供了一系列方法。

要查找文件是否已存在,请使用exists?方法。

File.exists?("temp.txt")
=> true

要确定文件是否真的是文件而不是目录,请使用file?方法。

File.file?("ruby")
=> false	

同样,找出它是否是目录,请使用directory?方法。

File.directory?("ruby")
=> true

要确定文件是可读,可写还是可执行的请使用readable?writeable?executable?方法。

File.readable?("temp.txt")
=> true

File.writable?("temp.txt")
=> true

File.executable?("temp.txt")
=> false

使用size方法获取文件的大小。

File.size("temp.txt")
=> 99

查找文件是否为零的空文件(即长度为零)使用zero?

File.zero?("temp.txt")
=> false

使用ftype方法找出文件的类型。

File.ftype("temp.txt")
=> "file"

File.ftype("../ruby")
=> "directory"

File.ftype("/dev/sda5")
=> "blockSpecial"

最后我们可以使用ctimemtimeatime来找出创建,修改和访问时间。

File.ctime("temp.txt")
=> Thu Nov 29 10:51:18 EST 2007

File.mtime("temp.txt")
=> Thu Nov 29 11:14:18 EST 2007

File.atime("temp.txt")
=> Thu Nov 29 11:14:19 EST 2007

5. 读写文件

打开现有文件或创建新文件后,我们需要能够读取和写入该文件。我们可以使用 readline 从文件读取行。

myfile = File.open("temp.txt")
=> #<File:temp.txt>

myfile.readline
=> "This is a test file\n"

myfile.readline
=> "It contains some example lines\n"

另外,我们可以使用each方法读取整个文件。

myfile = File.open("temp.txt")
=> #<File:temp.txt>

myfile.each {|line| print line }
This is a test file
It contains some example lines
But other  than that
It serves no real purpose

也可以使用getc方法逐个字符地从文件中提取数据。

myfile = File.open("Hello.txt")
=> #<File:temp.txt>

myfile.getc.chr
=> "H"
myfile.getc.chr
=> "e"
myfile.getc.chr
=> "l"

我们还可以使用putc方法写入文件,一次写入一个字符,或者使用puts方法一次写入一个字符串-请注意rewind方法调用的重要性。这会将文件指针移回文件的开头,因此我们可以阅读所写内容。

myfile = File.new("write.txt", "w+")    # 读写模式打开文件
=> #<File:write.txt>

myfile.puts("This test line 1")         # 写入第一行
=> nil

myfile.puts("This test line 2")         # 写入第二行
=> nil

myfile.rewind                           # 将指针移动到开头
=> 0

myfile.readline
=> "This test line 1\n"

myfile.readline
=> "This test line 2\n"

6. 小结

本章节我们学习了如何使用 File.new 创建文件,文件模式,File.open 打开文件,File.rename 重命名文件,File.delete 删除文件,各种获取文件信息的方法以及文件读写的方法。