File 类

File 对象是底层平台中文件的表示。

File 类扩展了 FileTest 模块,支持诸如 File.exist? 等单例方法。

关于示例

这里的许多示例使用这些变量

# English text with newlines.
text = <<~EOT
  First line
  Second line

  Fourth line
  Fifth line
EOT

# Russian text.
russian = "\u{442 435 441 442}" # => "тест"

# Binary data.
data = "\u9990\u9991\u9992\u9993\u9994"

# Text file.
File.write('t.txt', text)

# File with Russian text.
File.write('t.rus', russian)

# File with binary data.
f = File.new('t.dat', 'wb:UTF-16')
f.write(data)
f.close

访问模式

方法 File.newFile.open 都为给定的文件路径创建一个 File 对象。

字符串访问模式

方法 File.newFile.open 都可能接受字符串参数 mode,该参数

读/写模式

读/写 mode 确定

这些表总结了

Read/Write Modes for Existing File

|------|-----------|----------|----------|----------|-----------|
| R/W  | Initial   |          | Initial  |          | Initial   |
| Mode | Truncate? |  Read    | Read Pos |  Write   | Write Pos |
|------|-----------|----------|----------|----------|-----------|
| 'r'  |    No     | Anywhere |    0     |   Error  |     -     |
| 'w'  |    Yes    |   Error  |    -     | Anywhere |     0     |
| 'a'  |    No     |   Error  |    -     | End only |    End    |
| 'r+' |    No     | Anywhere |    0     | Anywhere |     0     |
| 'w+' |    Yes    | Anywhere |    0     | Anywhere |     0     |
| 'a+' |    No     | Anywhere |   End    | End only |    End    |
|------|-----------|----------|----------|----------|-----------|

Read/Write Modes for \File To Be Created

|------|----------|----------|----------|-----------|
| R/W  |          | Initial  |          | Initial   |
| Mode |  Read    | Read Pos |  Write   | Write Pos |
|------|----------|----------|----------|-----------|
| 'w'  |   Error  |    -     | Anywhere |     0     |
| 'a'  |   Error  |    -     | End only |     0     |
| 'w+' | Anywhere |    0     | Anywhere |     0     |
| 'a+' | Anywhere |    0     | End only |    End    |
|------|----------|----------|----------|-----------|

请注意,对于不存在的文件,不允许使用模式 'r''r+'(会引发异常)。

在表格中

现有文件的读/写模式
要创建的文件的读/写模式

请注意,对于不存在的文件,不允许使用模式 'r''r+'(会引发异常)。

数据模式

要指定数据是应被视为文本还是二进制数据,可以将以下任一项附加到上述任何字符串读/写模式

如果两者都未给出,则流默认为文本数据。

示例

File.new('t.txt', 'rt')
File.new('t.dat', 'rb')

指定数据模式时,不得省略读/写模式,并且数据模式必须位于文件创建模式之前(如果给定)。

File.new('t.dat', 'b')   # Raises an exception.
File.new('t.dat', 'rxb') # Raises an exception.

文件创建模式

以下内容可以附加到上述任何可写的字符串模式

示例

File.new('t.tmp', 'wx')

指定文件创建模式时,不得省略读/写模式,并且文件创建模式必须遵循数据模式。

File.new('t.dat', 'x')   # Raises an exception.
File.new('t.dat', 'rxb') # Raises an exception.

整数访问模式

当 mode 为整数时,它必须是以下一个或多个常量,这些常量可以通过按位或运算符 | 组合

示例

File.new('t.txt', File::RDONLY)
File.new('t.tmp', File::RDWR | File::CREAT | File::EXCL)

注意:Method IO#set_encoding 不允许将模式指定为整数。

指定为整数的文件创建模式

这些常量也可以通过 OR 运算添加到整数模式中

指定为整数的数据模式

数据模式不能指定为整数。当流访问模式以整数形式给出时,数据模式始终为文本,而不是二进制。

请注意,虽然存在常量 File::BINARY,但在整数流模式中设置其值没有任何效果;这是因为,如 File::Constants 中记录的那样,File::BINARY 值会禁用行代码转换,但不会更改外部编码。

编码

上述任何字符串模式都可以通过附加一个或两个编码名称(以冒号分隔)来指定编码 - 仅指定外部编码或同时指定外部编码和内部编码

f = File.new('t.dat', 'rb')
f.external_encoding # => #<Encoding:ASCII-8BIT>
f.internal_encoding # => nil
f = File.new('t.dat', 'rb:UTF-16')
f.external_encoding # => #<Encoding:UTF-16 (dummy)>
f.internal_encoding # => nil
f = File.new('t.dat', 'rb:UTF-16:UTF-16')
f.external_encoding # => #<Encoding:UTF-16 (dummy)>
f.internal_encoding # => #<Encoding:UTF-16>
f.close

大量的编码名称可以在数组 Encoding.name_list 中找到

Encoding.name_list.take(3) # => ["ASCII-8BIT", "UTF-8", "US-ASCII"]

设置外部编码时,读取的字符串在读取时会使用该编码进行标记,并且写入的字符串在写入时会转换为该编码。

当同时设置外部和内部编码时,读取的字符串会从外部编码转换为内部编码,写入的字符串会从内部编码转换为外部编码。有关转码输入和输出的更多详细信息,请参阅 编码

如果外部编码为 'BOM|UTF-8''BOM|UTF-16LE''BOM|UTF16-BE',则 Ruby 会检查输入文档中是否存在 Unicode BOM,以帮助确定编码。对于 UTF-16 编码,文件打开模式必须是二进制。如果找到 BOM,则会将其剥离,并使用 BOM 中的外部编码。

请注意,BOM 样式编码选项不区分大小写,因此 'bom|utf-8' 也是有效的。

文件权限

File 对象具有权限,这是一个八进制整数,表示底层平台中实际文件的权限。

请注意,文件权限与文件流(File 对象)的模式截然不同。

在 File 对象中,权限可通过以下方式获得,其中方法 mode 尽管名称如此,但返回的是权限。

f = File.new('t.txt')
f.lstat.mode.to_s(8) # => "100644"

在基于 Unix 的操作系统中,三个低位八进制数字表示所有者 (6)、组 (4) 和世界 (4) 的权限。每个八进制数字中的三位分别表示读取、写入和执行权限。

因此,权限 0644 表示所有者的读写访问权限,以及组和世界的只读访问权限。请参阅手册页 open(2)chmod(2)

对于目录,执行位的含义会发生变化:当设置时,可以搜索该目录。

权限中的高位可能指示文件类型(普通文件、目录、管道、套接字等)和各种其他特殊功能。

在非 Posix 操作系统中,权限可能只包括只读或读写,在这种情况下,其余权限将类似于典型值。例如,在 Windows 上,默认权限为 0644;唯一可以进行的更改是将文件设置为只读,这报告为 0444

对于实际在底层平台中创建文件的方法(而不是仅仅创建 File 对象),可以指定权限

File.new('t.tmp', File::CREAT, 0644)
File.new('t.tmp', File::CREAT, 0444)

权限也可以更改

f = File.new('t.tmp', File::CREAT, 0444)
f.chmod(0644)
f.chmod(0444)

文件常量

可在模块 File::Constants 中找到用于 File 和 IO 方法的各种常量;它们的名称数组由 File::Constants.constants 返回。

这里有什么

首先,看看别处的。File 类

在这里,File 类提供的方法对于以下操作很有用

创建

查询

路径

时间

类型

内容

设置

其他