2009-07-14 11 views
3

私はC++でウォーキングしています。 ディレクトリにサブディレクトリが含まれているかどうかを知る方法はありますか?ディレクトリにサブディレクトリがあるかどうかを知る方法はありますか?

CFileFindは合計ファイルを検索する必要があります。 唯一のサブディレクトリがリストの最後にあり、多くのファイルがある場合は時間がかかります。

たとえば、ディレクトリAには99995個のファイルとFindNextFile Listの最後に1個のサブディレクトリが含まれています。私は99995回試してみましたが、次に言う:はい、サブディレクトリが含まれていますか?

答えて

0

非常に高速に実行できるかどうかは、完全にプラットフォームに依存します。

Win32では、FindFirstFile/FindNextFileまたはMFC CFileFindのようなものの上にラッパーを使用し、ディレクトリを最初にリストすることができないような順序で項目をリストします。

+0

99995個のファイルと1個のサブディレクトリant FindNextFile Listの終わり。私は99995回試してみましたが、次に言う:はい、サブディレクトリが含まれていますか? – user25749

+0

これは、Win32でディレクトリの内容を一覧表示する唯一の方法です。そのため、エクスプローラで多数のファイルを含むフォルダを開くには、非常に多くの時間がかかります。 – sharptooth

+1

OMG、本当に悪いデザイン... – user25749

1

.Netフレームワークを使用している場合は、Directory.GetDirectoriesを使用して、配列のサイズが0であることを確認できます。これでスピードが得られるかどうかはわかりません。

ディレクトリを管理できる場合は、サブディレクトリを持つディレクトリの名前が一方向になり、サブディレクトリのあるディレクトリが別のディレクトリになるように命名規則を適用できます。

1

ブーストファイルシステムライブラリを使用できます。

名前によるクラスdirectory_iterator [boost/filesystem/operations.hppで宣言されています]には、ファイルを一覧表示するために使用できる多くの機能があり、ファイルがサブディレクトリであるかどうかを確認します(is_directory - お探しですか?

詳細については、次のリンクを参照してください。 link text

MFC [あなたがCFileFindを使用していることをちょうど見た]を使用しているようですが、以前は見ていませんでした。 申し訳ありませんが、多くの情報がありませんでした。 FindFirstFile/FindNextFileを使用する必要があります。

+0

多くの皆さん、同じことに感謝します!ブーストファイルシステムは便利です。私はLinuxで働いていたときに使った。 – user25749

+3

ブーストプリミティブは、Win32でFindFirstFile/FindNextFileも使うと思う。彼らがいない場合、彼らはどのように動作し、その解決策が良いかどうかを調べることができます。 – sharptooth

2

マイクロソフトのRaymond Chenが、おそらくここに該当する投稿を書いています。Computing the size of a directory is more than just adding file sizes。本質的に、彼はdirのエントリのような情報をdirのエントリに格納することはできないと説明しています。異なるユーザが異なる権限を持っている可能性があり、したがって、ユーザーが表示すべきサイズを取得する唯一の方法は、ユーザーの要求に応じてサイズを計算することです。

あなたの場合、その答えはおそらく同じ理由から生じるでしょう。ルートディレクトリの表示が別の認証情報で実行されている別のアプリと異なる場合があるため、アプリで使用可能なディレクトリのリストは、アプリから要求されたときにのみ判別できます。なぜWindowsは私が知らないファイルと一緒にディレクトリを保存するのですか?

Win32はユーザーモードでファイルシステムに近いので、.NETのような上位レベルのソリューションは避けます。インターフェイスを単純化するだけかもしれません。ドライバーは速く働くかもしれませんが、私の知識の範囲外です。

関連する問題