4

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

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

たとえば、ディレクトリ A には 99995 個のファイルと、FindNextFile リストの最後にある 1 つのサブディレクトリが含まれています。99995 回試したら、「はい、サブディレクトリが含まれていますか?」

4

4 に答える 4

2

Microsoft の Raymond Chen は、おそらくここに当てはまる投稿を書いています。要するに、ディレクトリのサイズなどの情報をディレクトリのエントリに保存することはできないと彼は説明しています。これは、ユーザーによってアクセス許可が異なり、一部のファイルが見えなくなる可能性があるためです。したがって、ユーザーに表示されるサイズを取得する唯一の方法は、ユーザーからの要求に応じて計算することです。

あなたの場合、答えはおそらく同じ理由から生じます。アプリで使用できるディレクトリのリストは、アプリが要求したときにのみ決定できます。これは、ルート ディレクトリのビューが、別の資格情報で実行されている別のアプリのビューと異なる場合があるためです。Windows がファイルと一緒にディレクトリを保存する理由はわかりませんが、それは当然のことです。

Win32 はユーザー モードでファイル システムにできるだけ近いため、.NET などの高レベルのソリューションはインターフェイスを単純化するだけなので避けたいと思います。ドライバーの方が速いかもしれませんが、それは私の知る範囲外です。

于 2009-07-14T08:35:09.677 に答える
1

Boostファイルシステムライブラリを使用してみることができます。

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

詳細については、次のリンクを参照してください。 リンクテキスト

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

于 2009-07-14T07:30:20.823 に答える
1

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

ディレクトリを制御できる場合は、命名規則を適用して、サブディレクトリを持つディレクトリにはある方法で名前を付け、サブディレクトリを持たないディレクトリには別の名前を付けることができます。

于 2009-07-14T07:05:12.153 に答える
0

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

Win32 では、MFC CFileFind などの上に FindFirstFile/FindNextFile またはラッパーを使用し、ディレクトリを最初にリストすることを強制できない順序でアイテムをリストします。

于 2009-07-14T06:48:22.887 に答える