3

私はクラス用のプログラムを書いていますが、少しのコードの出力について疑問に思っています。私はこのようなコードを持っています:

DIR* dir = opendir(".");
struct dirent* reader;

while ((reader = readdir(dir)) != NULL)
{
//print the name of the path found by reader.
}

これで問題なく動作しますが、最初の2つのリストは常に次のようになっています。

.
..
//rest of files here

ここで、最初のドットは単に現在のディレクトリの名前であると想定して.いますが、2番目のダブルドットは何のためのものですか?ファイル階層を上に移動できることは知ってcd ..いますが、サブディレクトリ名を読み取るときになぜそれが出力されるのかわかりません。

私が心配している理由は、すべてのファイルを再帰的に調べたいのですが、を調べた場合..、そこにある最初のディレクトリ名があり.、ループが発生します。では、どうすればこれを回避できますか?

4

2 に答える 2

6

..親ディレクトリです。ファイルシステムのルートにいる場合を除き、ルート ディレクトリと同じです。

基本的に、変数がまたはdirのいずれかと等しいかどうかを確認する必要があります。そうであれば、そのディレクトリをスキップします。...

そのチェックをループに入れるか、whileディレクトリの配列からこれら 2 つのディレクトリを除外することで、これを実現できます。

ああ、で始まるディレクトリを誤ってスキップしないように注意してください.。それらはまだ有効なディレクトリだからです。ディレクトリ名全体が.またはであることを確認してください..

于 2011-09-01T21:33:02.770 に答える
2

ディレクトリ構造に降りるときは、再帰を制限することが重要です. .(現在のディレクトリ)と..(親ディレクトリ)を無視するだけでは十分ではありません. fooリンクするシンボリックリンクファイルを考えてみましょう。.これは、次のように同じ効果があります.

深さのカウント、または「見られたディレクトリ」または構造のいずれかを保持します (スマートな実装では、サイクルを検出してプルーニングできます)。また、readlinkを使用してターゲットを検査することも検討してください。(ディレクトリへのハードリンクは OS X で作成できるため、readlink が役立ちますが、他のガードの必要性を省略していないことに注意してください。)

ハッピーコーディング。

于 2011-09-01T21:39:32.777 に答える