Laden...

Dateianzahl eines Ordners/der Festplatte auslesen

Erstellt von frankhammer vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.824 Views
frankhammer Themenstarter:in
42 Beiträge seit 2009
vor 14 Jahren
Dateianzahl eines Ordners/der Festplatte auslesen

Hallo,

ich bin neu auf myCSharp und hab schon viele hilfreiche Threads hier gelesen. Super Community. Nun habe ich aber leider mein gegenwärtiges Problem nicht finden können oder aber ich hab falsche Suchwörter benutzt. Wenn das der Fall sein sollte tut es mir leid!

Zu meinem Problem:
Wir programmieren ein Suchprogramm. Dieses Suchprogramm hat eine Progressbar, die rekursiv einmal die ganzen Dateien zählt, die in dem zu durchsuchendem Ordner enthalten sind.

Besonders aber bei großen Laufwerken bzw. Ordnern dauert das ewig lange. Windows kann das über "Markieren" und Rechtsklick auf Eigenschaften innerhalb weniger Sekunden.

Gibt es eine Möglichkeit auf die Werte von Windows zuzugreifen? Sprich wie viele Dateien es in einem Ordner/Laufwerk gibt, ohne dass man selbst suchen muss?

Vielen Dank für Eure Bemühungen, dass hier ist ne echt super und aktive Community. 😁

Gruß,

frankhammer

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

hast du schon

System.IO.Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories);

probiert?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

U
36 Beiträge seit 2008
vor 14 Jahren

Hallo frankhammer,

wenn es um die Anzahl der Dateien und Verzeichnisse auf einem Laufwerk geht, helfe ich mir folgendermaßen :

ich lese mit der API-Funktion GetFileSizeEx die Größe des Master-File-Tables ($MFT).

Dann lese ich mit der API-Funktion DeviceIoControl den NTFS_VOLUME_DATA_BUFFER . Dieser enthält die Größe eines MFT-Records (BytesPerFileRecordSegment).

Ich teile dann die Größe des MFT durch die Größe eines Records und tue dann so, als ob jeder Record für eine Datei oder ein Verzeichnis steht. Das funktioniert in der Praxis meist ganz gut.

Wie man die Anzahl der Dateien in einem Verzeichnis ohne Scan herausfindet, weiß ich nicht; und ich glaube Windows weiß es auch nicht, denn wenn Du im Windows-Explorer bei einem Verzeichnis auf Eigenschaften klickst, wird ja ein Scan des Dateisystems durchgeführt, um die Anzahl zu ermitteln.

Gruß

Michael Schmitz

PS:
Der Scan des Dateisystems geht mit den API-Funktionen FindFirstFile und FindNextFile recht flott. Bei einer Systempartition mit 60.000 Dateien und Verzeichnissen geht das bei mir in 15 sec.

frankhammer Themenstarter:in
42 Beiträge seit 2009
vor 14 Jahren
System.IO.Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories);  

Ja, das war das allererste was wir programmiert hatten. Leider ist es so, dass wenn man dann bspw. C:\ durchsucht man eine UnauthorizedAccessException bekommt, da man ja keinen Zugriff auf den Ordner System Volume Informationen hat. Natürlich haben wir alles in Try-Catch-Blöcken, doch nachdem die Exception abgefangen wurde, gibt es keine Ergebnisse. 😉 Deswegen gingen wir den Weg der Rekursion. Wenn halt ein Ordner nicht gelesen werden konnte ging es weiter im Text.

@Hotzenplotz
Die API-Lösung hört sich gut an. Leider bin ich noch relativ neu in C# und erst recht mit Programmieren mit API-Schnittstellen. Ich werd mich mal dazu schlau machen und alles aufsaugen was ich dazu finden kann. 😁

Danke für Eure schnelle und gute Hilfe! Echt super hier! Nicht so wie in anderen Foren. 😉

Gruß,

frankhammer

6.911 Beiträge seit 2009
vor 14 Jahren

Für API-Zugriffe gebe ich gleich den Tipp für eine wertvolle Site: http://www.pinvoke.net/

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo frankhammer,

eigentlich sollte es auch mit .NET und ohne API schnell genug gehen.

Leider ist es so, dass wenn man dann bspw. C:\ durchsucht man eine UnauthorizedAccessException bekommt,

siehe [Snippet] Verzeichnisse und Dateien rekursiv durchlaufen

herbivore

frankhammer Themenstarter:in
42 Beiträge seit 2009
vor 14 Jahren

So wie herbivore haben wir es gelöst...

Wir haben noch ein wenig dran optimiert, aber wesentlich schneller läuft die Rekursion leider nicht. Trotzdem vielen Dank für die Hilfe! Hier bekommt man sie wenigstens und bekommt nicht solche dummen Kommentare wie bspw. "Benutz den Debugger...".

Gruß,

frankhammer

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo frankhammer,

Hier bekommt man sie wenigstens und bekommt nicht solche dummen Kommentare wie bspw. "Benutz den Debugger...".

Danke für die Blumen. Allerdings hängen die Antworten auch hier von den Fragen ab. Auch wir erwarten eigens Bemühen von den Fragestellern. Fehlt dieses und handelt es sich um ein Problem, bei dem der Debugger fehlende Informationen liefern würde, würde auch wir schreiben "Benutz den Debugger...". 😃 Und dumm wäre der Kommentar dann sicher nicht. Aber du hast auf jeden Fall recht damit, dass wir wirklich zu helfen versuchen. Auch wenn wir "Benutz den Debugger..." schreiben. 😃

herbivore