10

readdir のような関数を使用してディレクトリの内容を一覧表示すると、返されるファイル名には必ず "." も含まれます。と ".."。これらはファイル システム内の通常のリンクであり、実際のファイルと見分けがつかないのではないかと疑っていますが、リストしているディレクトリ内の実際のオブジェクトではないため、常に除外する必要があります。readdir のような関数にそれらを含める正当な理由はありますか? 一部のオペレーティング システムまたはファイル システムには、より多くの、または異なる仮想ファイル名が含まれていますか? 「。」との文字列比較を行う以外に、それらを除外するより良い方法はありますか? と ".."?

更新:回答していただきありがとうございます。./ や ../ のようなものは、検索と置換によって処理できる単なる規則にすぎないとずっと思っていたようです。それらをファイルシステム自体の一部にすることは、おそらくより効率的で透過的ですが、少し驚くべきことです。

ただし、1 つの疑問が残ります。および .. はこれらのリンクの任意の名前ですが、異なる名前を使用するファイル システムはありますか?

4

8 に答える 8

14

.実際に..はファイルシステムのハードリンクです。これらは、参照パスに基づいて相対パスを指定できるようにするために必要です ( を考慮してください"../sibling/file.txt")。これらのハード リンクは実際にはファイル システムに存在するため、 がそれらについて説明することは理にかなってreaddirいます。(実際には、この用語hard linkは、参照される実際のディレクトリと区別できない名前を意味するだけです。これらは両方ともinodeファイルシステムで同じものを指します)。

strcmpそれらをリストしたくない場合は、単にそれらを無視するのが最善の方法です。

于 2008-11-27T01:49:28.303 に答える
7

もともとそれらはハード リンクであり、. そして..最小限でした。ただし、これは最新のすべてのファイルシステムに当てはまるわけではありません。

しかし、これら 2 つのディレクトリ エントリが実際には存在しないファイルシステムでも、readdir などの API を介してその存在を報告するように、規則が確立されています。これを変更すると、多くのコードが壊れます。

于 2008-11-27T03:10:41.947 に答える
4

これらはファイル システム内の通常のリンクであり、実際のファイルと見分けがつかないのではないかと疑っています。

彼らです。ファイル システムは、「フォルダ」を「含む」フォルダの階層として認識されるかもしれませんが、実際には、ディレクトリがノードでファイルがリーフである、二重にリンクされたツリー1です。そのため、現在のノードのリーフにアクセスし、ツリーをトラバースするためのリンクが必要で.あり..、それらは他のすべてのリンクと同じものです。

を呼び出すとreaddir、現在のノードから直接移動できるすべての場所が取得されます。「上」と認識した場所をリストしたくない場合は、自分で分類する必要があります。そのためには、おそらく と呼ばれる小さな関数を作成する必要がありますreaddir_down。ディレクトリがどの順序でリストされているかはわかりませんreaddirが、おそらく最初の 2 つのエントリを破棄できます。

1 ) これは最初の概算であり、ツリーを実際にネットにする「ハード リンク」も存在します。

于 2008-11-27T02:10:26.577 に答える
3

理由の 1 つは、それらがないと親ディレクトリにアクセスできないことです。または、現在のディレクトリへのハンドルを取得します。

それらがなければ、次のようなことはできません。

./run_this

実際、「.」を追加できませんでした。つまり、まだパスにないファイルを実行することはできませんでした。

于 2008-11-27T01:45:43.147 に答える
2

これらは通常のディレクトリであり、現在のディレクトリとその上のディレクトリへの「ハード リンク」です。それらはすべてのディレクトリに存在します (ルート レベルであっても、..とまったく同じ.です)。

を使用する場合、とを使用lsして除外できます(大文字の に注意してください)。...ls -A-A

.orではなくすべてのドット ファイルにコマンドを適用する場合、3 文字以上の名前を持つドット ファイルにのみ一致する which..をよく使用します。.??*

touch .??*

このパターンでは、ドットで始まり 2 文字しかないその他のファイルも除外されますが (例: .x)、これらのファイルは一般的ではありません。

私のようにプログラムによるファイルリストを使用する場合は、手動でreaddir()除外する必要があります。これらの 2 つのファイルは、返されるリストの最初にあるはずなので、次のようにすることができます。...readdir()

@files = readdir(DIR);
for (1..2) { shift @files; } # get rid of . and ..
# go on with your business
于 2008-11-27T01:47:00.087 に答える
0

それらはディレクトリ リストに格納されているため、報告されます。それがユニセフが常に働いてきた方法です。

于 2008-11-27T01:47:36.327 に答える
0

Unix ライクなオペレーティング システムでは、ディレクトリを一覧表示するコマンドにそれらが含まれているため、それらを使用してファイル システム階層を上下に移動します。

のようなものgrep { not /^.{1,2}\z/ } readdir HANDLEがあなたのために働くはずです。

于 2008-11-27T01:50:37.800 に答える
-4

ディレクトリ スキャンがこれらのファイル名を返す正当な理由はありません。

于 2008-11-27T02:00:48.997 に答える