1

Dir-s は -s に比べてぎこちないように見えFileます。メソッドの多くはメソッドに似ていIOますが、aDirは から継承しませんIO。たとえばtellIOドキュメントには次のように書かれています。

ios の現在のオフセット (バイト単位) を返します。

通常の をread-ing および-ingすると、およびのような大きな数値が得られます。私は当初、これらの整数がより「配列に似た」ものであり、単純な範囲であることを期待していました。tellDir346723732422823816

  • これらは、に含まれるファイルのバイトDirですか?
  • そうでない場合、次のように返される数値に意味はありますIO#tellか?
  • また、ストリームではないのに、なぜDir-s にopenand機能があるのですか?close
  • a を閉じることDirは、通常と同じくらい重要IOですか?

Ruby がどのように機能するかについての一般的な説明をDirいただければ幸いです。

更新もう 1 つの紛らわしい部分: Dirs が s でない場合IO、なぜcloseは を発生させるのIOerrorですか?

ディレクトリ ストリームを閉じます。さらに dir にアクセスしようとすると、IOError が発生します。

また、ドキュメントでは、これを「ディレクトリ ストリーム」と見なしていることにも注意してください。したがって、これは再び、それらがストリームであるかどうかという問題を提起します。そうでない場合、なぜ命名規則なのですか?

4

2 に答える 2

3

言うためのドキュメントDir#tell

Returns the current position in dir.

位置が何を意味するかを指定せずに。戻り値が意味するものは、使用している OS と、ディレクトリを含むファイル システムのタイプによって異なる可能性があります。その値は不透明なものとして扱われるべきであり、決して解釈しようとしないでください。それが提供する唯一の目的は、 を呼び出すなどして、その値を OS に送り返すことができるようにすることDir#seekです。

ディレクトリは単なる巨大なファイルではありません。より一般的には、ファイル名からファイルのデータが含まれている場所に関する情報にマップするだけです。

自分でディレクトリに書き込むべきではありません (私が知る限り)。

于 2012-12-11T21:50:54.367 に答える
1

IRC チャットの後、私が到達した結論は次のとおりです。

DirオブジェクトはIO

DirIO クラスから継承せず、読み取り専用です。IOErrorで anが発生する理由はまだわかりません#close

ただし、開かれたDirIS はストリームです

クラス Dir のオブジェクトは、基礎となるファイル システム内のディレクトリを表すディレクトリ ストリームです。

また、ソースを確認Dir#closeすると、C関数を呼び出していることがわかりますdircloseman dircloseプリント:

この closedir() 関数は、 に関連付けられたディレクトリ ストリームを閉じます dirp。への呼び出しが成功すると、 にclosedir()関連付けられた基になるファイル記述子も閉じられますdirpdirp この呼び出しの後、ディレクトリ ストリーム記述子は使用できません。

...dirpパラメータであること。

そうです、インスタンス化されたDirsはストリーム開きます。そうです、Dirs はファイル記述子を使用し、ガベージ コレクションに依存したくない場合は閉じる必要があります。

#ruby-lang ircのinjektや他の人たちに感謝します!

于 2012-12-12T17:09:20.287 に答える