CFtpFileFindを使ってファイル検索をしようとしています。
サブフォルダ内も検索したいので、再帰処理を行おうとしているのですが、再起する関数に入るたびに、
FTPの接続はしなおさないといけないのでしょうか?
宜しくお願いします。
んなことは無いっぽい。そのために CFtpConnection と CFtpFileFind は別インスタンスになっている。
ftp の仕様的に幅優先でないとうまくいかないようだけど。
深さ優先で検索するなら接続しなおすほうが簡単っぽい。
tetrapodさん、ありがとうございます。
すみませんが、"幅優先"の意味がわからないのですが、フォルダ内の件数が多い、という意味で取って間違いないでしょうか?
現在、検索開始関数で接続し、接続に使用したCFtpConnectionの値を検索を実施する関数に引数で渡すように作成しています。
検索を実施する関数を再帰させてサブフォルダを検索しています。
引数で渡されたCFtpConnectionの値を元にSetCurrentDirectoryをすると
フォルダ内の関数、ファイルを見つけることが出来ません。
再帰関数内ではSetCurrentDirectoryした後に
CFtpFileFind nFind(引数で渡したCFtpConnection値);
の宣言を行い、nFind.FindFile(検索フォルダ)で検索しています。
再帰する関数毎にCFtpConnectionすると、もちろん検索できます。
再帰するたびに接続するのは切断漏れが出そうなのでなるべく避けたいのですが、サブフォルダの階層が不明な場合は、接続し直す方が良いのでしょうか?
深さ優先探索と幅優先探索で調査してみて理解してちょ。要は
深さ優先探索=1フォルダ内の列挙中にディレクトリを見つけたら、
残りのファイル・ディレクトリの列挙より先にサブディレクトリ内列挙に行く
幅優先探索=1フォルダ内の全ファイル・ディレクトリを列挙する。
列挙完了後に1つづつサブディレクトリ列挙する
ftp の仕様上、幅優先でないとうまくいかない。
> 再帰するたびに接続するのは切断漏れが出そう
心配すべきは切断漏れではなくてサーバ側資源の枯渇だろう。
検索中に最大接続数に達して、以下接続拒否=検索不能、のほうがありそうなシナリオ。
tetrapod さん、ありがとうございます。
ftpは幅優先、というのがあるんですね。
接続数の絡みについては考えていませんでした。
まずは、幅優先と、深さ優先について調べます。
その上でソースを見直してからまた質問させていただこうと思います。
解決はしていませんが、勉強し直してから出直しますので、とりあえず"解決"とさせていただきます。
ありがとうございました。
ツイート | ![]() |