1

Dir与 -s相比,-s 似乎很尴尬File。许多方法与方法相似IO,但 aDir不继承自IO. 例如,tellIO文档中写道:

返回 ios 的当前偏移量(以字节为单位)。

当通过正常的read-ing 和-ing 时,我会得到像and这样的大量数字。我最初期望这些整数更像“数组”并且只是一个简单的范围。tellDir346723732422823816

  • 这些是包含在文件中的字节Dir吗?
  • 如果没有,返回的数字有什么意义IO#tell吗?
  • 另外,如果 -s不是 Streams ,为什么它们Dir具有openand功能?close
  • 关闭 a 仍然和Dir正常一样重要IO吗?

任何关于 Ruby 如何工作的一般解释Dir都将不胜感激。

更新另一个令人困惑的部分:如果Dirs 不是IOs,为什么close会引发一个IOerror

关闭目录流。任何进一步尝试访问 dir 都会引发 IOError。

另请注意,在文档中它认为它是“目录流”。因此,这再次提出了它们是否流式传输的问题,如果不是,为什么要使用命名约定?

4

2 回答 2

3

文档Dir#tell说:

Returns the current position in dir.

没有具体说明该职位的含义。返回值的含义可能会根据您使用的操作系统以及包含目录的文件系统的类型而有所不同。该值应该被视为不透明的,不要试图以任何方式解释它。它服务的唯一目的是能够将该值发送回操作系统,例如通过调用Dir#seek.

目录不仅仅是一个巨大的文件。更典型的是,它们只是从文件名映射到有关文件数据所在位置的信息。

您不应该(据我所知不能)自己写入目录。

于 2012-12-11T21:50:54.367 回答
1

所以在一些 IRC 聊天之后,这是我得出的结论:

对象Dir不是IO

Dir不继承自 IO 类,仅可读。仍然不确定为什么IOError#close.

然而,一个打开Dir的就是一个流

Dir 类的对象是表示底层文件系统中目录的目录流。

此外,如果您检查源代码Dir#close您将看到它调用了 C 函数dircloseman dirclose印刷:

closedir() 函数关闭与关联的目录流 dirp。成功调用closedir()也会关闭与dirp. 此调用后目录流描述符dirp 不可用。

...dirp作为一个参数。

所以是的,实例化Dir的 s打开一个流,是的,Dirs 将使用文件描述符,如果您不想依赖垃圾收集,则需要关闭。

非常感谢#ruby-lang irc上的injekt和其他人!

于 2012-12-12T17:09:20.287 回答