2011-09-11 21 views
4

あなたは再帰的にディレクトリツリーをトラバースする必要がある場合は、それを行うには2つの方法があります:あなたが行くようにディレクトリの再帰呼び出し

  1. は、.../... /を増やす長さのパス名を構築し.. 。

  2. chdirを使用すると、各ディレクトリに降りてくるので、2つ以上のコンポーネントより長いパス名は扱いません。

最初の方法は私をより鮮明にしてくれます。途中でアンマウントされたような不適切なイベントに対しては、より強固な方法です。一方、GNU のコードを見てみると、ユーティリティを見つけると、2番目の方法が使用されていることがわかります。それには理由がありますか?私が考えていなかった第2の方法の利点?

答えて

3

ファイルツリー散歩に

も参照のErmが...実際には近代的な実装はそう

ftwを使用します短いです非常に有用なリソース:http://rosettacode.org/wiki/Walk_a_directory/Recursively#Library:_POSIX

+0

興味深い!どのように移植するのが実際にですか? – rwallace

+1

あなたの練習によって異なります。 BSDに由来するAPIです。それはLinux上で遍在しています。ソラール[has it](http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch04lev1sec21.html#ch04ex08); AIX [libc.aにある](http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.basetechref%2Fdoc%2Fbasetrf1%2Fnftw.htm )...私はそれがかなり普及していると思います。私は潜在的な違いについて知らない – sehe

+0

そしてhttp://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ftw.3.htmlにはMac OSがあります。新しいコードでは代わりにftsを使用すべきですか? – rwallace

2

私はあなたが(execオプションで)行くようにコマンドを実行することができますようfindは方法2を使用すると信じて

2

方法2は、シームレスに、パス内のコンポーネントの名前が変更される状況を処理します。

また、ディレクトリの検索中にそのディレクトリをアンマウントすることを拒否します。カーネルはディレクトリが使用中の場合、そのディレクトリをアンマウントすることを拒否します。これにはいくつかのプロセスのcwdが含まれます。

関連する問題