Ruby目录如何工作?

时间:2012-12-11 21:38:45

标签: ruby io stream directory

Dir - 与File - s相比似乎很尴尬。许多方法与IO方法类似,但Dir不会从IO继承。例如,tell文档中的IO显示为:

  

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

read - 和tell正常Dir时,我得到的数字很大,如346723732422823816。我原本期望这些整数更像“阵列式”,只是一个简单的范围。

  • 这些文件的字节是否包含在Dir
  • 如果没有,返回的数字是否有任何意义,如IO#tell
  • 另外,为什么Dir - 如果不是Streams会有openclose函数?
  • 关闭Dir与正常IO一样重要吗?

有关Ruby Dir如何工作的任何一般性解释都将受到赞赏。

更新另一个令人困惑的部分:如果Dir不是IO,为什么close会提出IOerror

  

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

另请注意,在文档中它认为它是“目录流”。所以这又提出了一个问题:它们是否是流,如果没有,为什么命名约定?

2 个答案:

答案 0 :(得分:3)

Dir#tell的文档说:

Returns the current position in dir.

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

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

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

答案 1 :(得分:1)

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

Dir对象不是IO

Dir不继承IO类,只能读取。仍然不确定为什么在IOError上引发了#close

已打开的Dir是一个流

  

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

另外,如果您检查Dir#close dirclose,您会看到它调用C函数man dircloseclosedir()打印:

  

dirp函数关闭与之关联的目录流   closedir()。成功调用dirp也会关闭基础文件   与dirp关联的描述符。目录流描述符dirp   在此次通话后无法使用。

... Dir是一个参数。

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

非常感谢 injekt 以及其他#ruby-lang irc!