2009-07-14 11 views
3

Ich bin in C++ woking. Gibt es eine Methode, um zu wissen, ob ein Verzeichnis ein Unterverzeichnis enthält?Gibt es eine Methode, um zu wissen, ob ein Verzeichnis ein Unterverzeichnis enthält?

CFileFind scheint durch insgesamt Dateien zu suchen. Es ist zeitaufwändig, wenn das einzige Unterverzeichnis am Ende der Liste steht und es viele Dateien gibt.

zum Beispiel: Verzeichnis A enthält 99995 Dateien und ein Unterverzeichnis am Ende der Liste Findnextfile. hatte ich 99995 mal versucht, dann sag: ja, es enthält Unterverzeichnis?

Antwort

0

Ob dies sehr schnell erledigt werden kann, ist völlig plattformabhängig.

Auf Win32 verwenden Sie FindFirstFile/FindNextFile oder Wrapper auf denen wie MFC CFileFind und sie Elemente in einer Reihenfolge auflisten, die nicht gezwungen werden, Verzeichnisse zuerst aufzulisten.

+0

sagen, 99995 Dateien und ein Unterverzeichnis am Ende der FindNextFile Liste. hatte ich 99995 mal versucht, dann sag: ja, es enthält Unterverzeichnis? – user25749

+0

Yeap, das ist die einzige Möglichkeit, Verzeichnisinhalte auf Win32 aufzulisten. Aus diesem Grund dauert das Öffnen eines Ordners mit vielen Dateien im Explorer so viel Zeit. – sharptooth

+1

OMG, ein wirklich schlechtes Design ... – user25749

1

Wenn Sie das .Net-Framework verwenden, können Sie Directory.GetDirectories verwenden und überprüfen, ob die Größe des Arrays 0 ist. Ich weiß nicht, ob das Ihnen Geschwindigkeit geben wird.

Wenn Sie die Kontrolle über die Verzeichnisse haben, können Sie eine Namenskonvention anwenden, so dass Verzeichnisse, die Unterverzeichnisse haben, in eine Richtung benannt werden und Verzeichnisse ohne Unterverzeichnisse eine andere benannt werden.

1

Sie können versuchen, die Boost-Dateisystembibliothek zu verwenden.

Eine Klasse mit dem Namen directory_iterator [deklariert in boost/filesystem/operations.hpp] hat viele Funktionen, die zum Auflisten von Dateien verwendet werden können, um herauszufinden, ob die Datei ein Unterverzeichnis ist (is_directory) suchen) etc ..

den folgenden Link, um weitere Informationen zu finden. link text

Es scheint, dass Sie MFC verwenden [nur sah, dass Sie CFileFind verwenden], habe das früher nicht gesehen. Sorry, hatte nicht viele Informationen. Möglicherweise müssen Sie FindFirstFile/FindNextFile verwenden.

+0

Vielen Dank gleich! Boost-Dateisystem ist nützlich. Ich habe es verwendet, als ich in Linux arbeitete – user25749

+3

Ich nehme an, dass Boost-Primitiven auch FindFirstFile/FindNextFile auf Win32 verwenden. Wenn sie nicht könnten, könnte man nachsehen, wie sie funktionieren und prüfen, ob diese Lösung besser ist. – sharptooth

2

Raymond Chen von Microsoft hat einen Beitrag geschrieben, das wahrscheinlich hier gilt: Computing the size of a directory is more than just adding file sizes. Im Wesentlichen erklärt er, dass Informationen wie die Größe eines Verzeichnisses nicht im Eintrag des Verzeichnisses gespeichert werden können, da verschiedene Benutzer möglicherweise unterschiedliche Berechtigungen haben und möglicherweise einige der Dateien für sie unsichtbar machen. Daher ist die einzige Möglichkeit, die Größe, die der Benutzer sehen sollte, zu erhalten, sie auf Anfrage des Benutzers zu berechnen.

In Ihrem Fall ergibt sich die Antwort wahrscheinlich aus dem gleichen Grund. Die Liste der für Ihre App verfügbaren Verzeichnisse kann nur ermittelt werden, wenn Ihre App danach fragt, da sich die Ansicht des Stammverzeichnisses von denen einer anderen App unterscheidet, die mit anderen Anmeldeinformationen ausgeführt wird. Warum Windows Verzeichnisse zusammen mit Dateien, die ich nicht weiß, aber das ist selbstverständlich.

Da Win32 ist so nah wie Sie an das Dateisystem im Benutzermodus gelangen, würde ich jede höhere Ebene Lösungen wie .NET vermeiden, da es nur die Schnittstelle vereinfacht. Ein Fahrer könnte schneller arbeiten, aber das ist außerhalb meines Wissens.