- あび
- ベテラン
- 会議室デビュー日: 2004/07/29
- 投稿数: 59
|
投稿日時: 2004-07-30 15:51
引用: |
|
Jittaさんの書き込み (2004-07-30 15:40) より:
深さがわからない(パス文字列の最大長というストッパーはあるが)から、再帰は避ける、じゃないかなぁ。
再帰処理だとローカル変数はすべてスタックして、新たな呼び出しようにメモリを確保しますよね。OOだとその辺のオーバーヘッドが結構かかるし、スタックオーバーフローという致命的例外も健在(はい、出しました)ですから。。。
パスをキュー、またはスタックして、whileで回します。
こんな感じ
↓↓↓
キュー q = new キュー();
q.ためる(引数);
while (q.覗く() == true) {
string p = q.取り出す();
ディレクトリpの一覧を取る
foreach f in pの一覧 {
if (f == ディレクトリ) q.ためる(f);
else {
処理;
}
}
}
|
(再度)MSDNのヘルプにあった「再帰の代わりにループを使用できる場合もあります」
の回答ですね。ありがとうございます。
今回は、この方法で実装してみようと思います。
|
- unibon
- ぬし
- 会議室デビュー日: 2002/08/22
- 投稿数: 1532
- お住まい・勤務地: 美人谷 良回答(20pt)
|
投稿日時: 2004-07-30 17:41
unibon です。こんにちわ。
引用: |
|
あびさんの書き込み (2004-07-30 15:51) より:
(再度)MSDNのヘルプにあった「再帰の代わりにループを使用できる場合もあります」
の回答ですね。ありがとうございます。
|
いわゆる、テールリカージョン(tail recursion)を最適化してループに置き換えることができる、ということですよね。
たしかにやったほうが良い、と思う反面、そこまで必要なんでしょうか、という疑問もあります。普通の実行環境では、スタックオーバーのエラーは、落ちるエラー、すなわち尾を引かない(良い)エラーなので、今回の目的がディレクトリの探索であることも考えると、オーバースペックのような気もします。
|
- えムナウ
- 大ベテラン
- 会議室デビュー日: 2004/06/10
- 投稿数: 187
- お住まい・勤務地: 東京
|
投稿日時: 2004-07-30 19:09
再帰の話でうっかりしていたけど
DirectoryInfo.GetFileSystemInfos メソッド は使えないんでしょうか?
_________________ えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
|
- あび
- ベテラン
- 会議室デビュー日: 2004/07/29
- 投稿数: 59
|
投稿日時: 2004-08-02 08:31
引用: |
|
えムナウさんの書き込み (2004-07-30 19:09) より:
再帰の話でうっかりしていたけど
DirectoryInfo.GetFileSystemInfos メソッド は使えないんでしょうか?
|
DirectoryInfo.GetFileSystemInfos も、直下のDirectoryとFileは取得できるのですが、下層をたどるには、同じような手法が必要なようです。
|