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
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!"
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.
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
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!"
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
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
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