【问题标题】:How do Ruby Directories work?Ruby 目录是如何工作的?
【发布时间】:2012-11-29 12:25:20
【问题描述】:

Dir-s 与File-s 相比显得有些尴尬。许多方法类似于IO 方法,但Dir 不继承自IO。例如,IO 文档中的 tell 内容如下:

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

read-ing 和 tell-ing 通过普通的 Dir 时,我会得到像 346723732422823816 这样的大数字。我原本希望这些整数更像“数组”,只是一个简单的范围。

  • 这些是Dir中包含的文件的字节吗?
  • 如果不是,像IO#tell这样返回的数字有什么意义吗?
  • 如果Dir-s 不是Streams,为什么还要有openclose 函数?
  • 关闭Dir 是否仍与关闭普通IO 一样重要?

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

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

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

还要注意,在文档中它认为它是一个“目录流”。所以这又提出了一个问题,它们是否流式传输,如果不是,为什么要使用命名约定?

【问题讨论】:

  • 谁? Dir 不是从 IO 继承的。目录不是IO 对象,它是指向文件的指针的组织结构。与IO无关。
  • @Casper 我的错。我看到了类似的术语并假设。
  • 它发生了。只需查看文档,它应该让一切都非常清楚:ruby-doc.org/core-1.9.3/Dir.html#method-i-seekruby-doc.org/core-1.9.3/Dir.html#method-i-tell
  • @Casper 我已经更新了我的问题。
  • @Casper 和我一直在阅读文档,我在这里的唯一原因是因为我觉得解释得不够好。

标签: ruby io stream directory


【解决方案1】:

Dir#tell 的文档说:

Returns the current position in dir.

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

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

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

【讨论】:

  • 你已经回答了我的大部分问题,但我已经根据 Casper 提出的假设对问题进行了一些更新。
【解决方案2】:

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

Dir 对象不是IO

Dir 不继承 IO 类,只可读。仍然不确定为什么在#close 上提出IOError

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

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

此外,如果您检查source 中的Dir#close,您会看到它调用了C 函数dircloseman dirclose 打印:

closedir() 函数关闭与关联的目录流 dirp。成功调用closedir() 也会关闭基础文件 与dirp 关联的描述符。目录流描述符dirp 通话后不可用。

...dirp 是一个参数。

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

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

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多