Alle Verzeichnisse und alle lokalen Festplatten durchsuchen
-
Hallo. Ich habe ein Problem, und zwar muss ich nach einer gegebenen Datei auf allen lokalen Festplatten und in allen Verzeichnissen suchen. Ich hab's schon mit ein paar Schleifen versucht, klappt aber irgendwie nicht. Kennt jemand Links zu Beispielen oder kann jemand ein simples eispiel posten? Wäre sehr dankbar.
-
bastle dir doch ne rekursive funktion
such dir im root alle verzeichnisse und geh dann in jedes unterverzeichnis rein und mach wieder das selbequasi so (pseudocode):
void SucheFile(verzeichnis, gesuchtesFile) { - geh ins verzeichnis - suche in dem verzeichnis nach gesuchtesFile - suche nächstes unterverzeichnis wenn gefunden dann SucheFile(verzeichnis, gesuchtesFile) }
sammle die gefundenen files in einer liste
Dateien und Verzeichnisse suchst du mit FindFirst, FindNext
-
FAQ ahoi...
-junix
-
Ok, offensichtlich schaff ich das trotzdem nicht. egal, Alternativ-Frage:
Wie kann ich die ganzen Dateiattribute, wie Schreibschutz (hier nur der Schreibschutz) herausnehmen und nachher wieder setzen? Da gibts doch bestimmt auch einen einfachen Befehl für, oder?
-
Neues Thema - Neuer Thread. Die Regel dürfte dir eigentlich hinlänglich bekannt sein, also halte dich dran!
-junix
-
hab dir mal was zusammengehaun, damit findest du alle dateien in Laufwerk C
musst jetzt nur noch die FindFile-Methode erweitern um alle laufwerke zu durchsuchenvoid Search(String Dir, String FileName, TStringList *Result) { TSearchRec sr; if (FindFirst(Dir + "\\" + FileName, faAnyFile, sr) == 0) do { Result->Add(Dir + "\\" + sr.Name); } while (FindNext(sr) == 0); if (FindFirst(Dir + "\\" + "*.", faDirectory, sr) == 0) do { if(sr.Name != "." && sr.Name != "..") Search(Dir + "\\" + sr.Name, FileName, Result); } while (FindNext(sr) == 0); FindClose(sr); } TStringList* FindFile(String Filename) { TStringList *Result = new TStringList; Search("C:", Filename, Result); return Result; }
aufruf über FindFile (z.B.: FindFile("*.txt"); )
-
@Jester: Wozu den FAQ Eintrag abschreiben? (o;
Überrascht mich übrigens, dass du die offensichtliche Faulheit auch noch unterstützt.... zumal er sich in den 15min wohl kaum wirklich um das Problem gekümmert hat... geschweige denn etwas ausprobiert...
-junix
-
ich sitz hier grad auf arbeit (praktikum) und langweile mich grad n bischen, da kommt mir ein wenig rumprogrammieren gerade recht
außerdem frisch ich dadurch meine programmierkenntnisse auf (hab schon ne weile nix mehr mit findfirst/findnext gemacht)aber du hast recht, ich hab die faulheit von Windoof extrem gefördert
naja, ich hoffe er vesucht zumindestens zu verstehen, was ich da gemacht hab
-
Jester2000 schrieb:
naja, ich hoffe er vesucht zumindestens zu verstehen, was ich da gemacht hab
Erfahrungsgemäss kann ich dir sagen: Das ist bei den wenigsten usern so.. Viele freuen sich dass es funktioniert und belassen es dabei...
Deshalb versuchten Jansen und ich ne Zeitlang auch den "Hilfe zur Selbsthilfe" durch das Schubsen in die richtige Richtung etwas populärer zu machen in der Hoffnung, die Copy 'n' Paste-programmierung etwas einzudämmen und dem Fragenden noch was beizubringen.Oft sind es doch nur fehlende Fertigkeiten in Sachen Algorithmenentwicklung bzw. fehlende Übung die zu Fragen veranlassen.
Vielleicht als Tip fürs nächste Mal: Wenn schon komplettlösungen posten, dann Bau was ein oder lass was elementares weg, damit sich der ders Kopiert damit auseinandersetzen muss.
-junix
-
stimmt, ist ne gute idee
aber der code geht nur für laufwerk c da muss sich Windoof zumindestens gedanken darüber machen, wie es auf allen laufwerksbuchstaben funktioniert (auch wenn dass nur noch ein kleiner schritt ist)werd mir aber deinen ratschlag merken und in zukunft stäker umsetzen
-
Danke Jester. Ich werds testen und noch dran rumbasteln, damit es bei mir klappt.
junix schrieb:
Überrascht mich übrigens, dass du die offensichtliche Faulheit auch noch unterstützt.... zumal er sich in den 15min wohl kaum wirklich um das Problem gekümmert hat... geschweige denn etwas ausprobiert...
Nu bild dir mal keine Vorurteile, es ist dringend... bin nämlich auch grad im Praktikum und da kommt mir Jester gerade recht, ich hab nämlich bevor ich hier gepostet habe 3 Stunden lang dran herumgeschraubt und es ging nichts. Ich war schon am verzweifeln.
-
Windoof schrieb:
junix schrieb:
Überrascht mich übrigens, dass du die offensichtliche Faulheit auch noch unterstützt.... zumal er sich in den 15min wohl kaum wirklich um das Problem gekümmert hat... geschweige denn etwas ausprobiert...
Nu bild dir mal keine Vorurteile, es ist dringend...
Das sind alle Fragen hier...
Windoof schrieb:
bin nämlich auch grad im Praktikum
Und was soll man da? Genau was dazulernen. Also ein Grund mehr, dir nicht die Arbeit vorzukauen.
Windoof schrieb:
ich hab nämlich bevor ich hier gepostet habe 3 Stunden lang dran herumgeschraubt und es ging nichts.
Lass mich mal nachsehen:
Wer | Wann | Zeit vergangen [min] ------------------------------------------------- Du | 07 Nov 2003 13:32 | 0 Jester | 07 Nov 2003 13:52 | 20 Du | 07 Nov 2003 14:07 | 15
Ich war ja schon immer schlecht in Mathe, aber 3 Stunden waren doch etwa 180min und soweit ich mich erinnern kann sind 180 != 15? Natürlich nur so ne unschuldige Annahme. Wie gesagt, habs nicht so mit Mathe...
Also für mich siehts klar nach "mag nicht, verstehs nicht gleich, ach frag ich mal nach" aus.
Naja, ein Detail.
-junix
-
15!=180, das ist richtig, bravo, bist gut in Mathe, aber lies dir meinen Post nochmal durch....... ja, eine Textstelle sollte dir auffallen: "[...]bevor ich hier gepostet habe[...]"!!!
Wie dem auch sei, funzt soweit, nur eben dass ich nicht richtig auf TDriveComboBox::Items::Count zugreifen kann. Warum? Und wie kann man das umgehen?
-
vielleicht hilft dir folgender thread:
http://www.c-plusplus.net/forum/viewtopic.php?t=51461&highlight=laufwerkewenn nicht, dann benutz mal die suchfunktion
-
Windoof schrieb:
15!=180, das ist richtig, bravo, bist gut in Mathe, aber lies dir meinen Post nochmal durch....... ja, eine Textstelle sollte dir auffallen: "[...]bevor ich hier gepostet habe[...]"!!!
Deine Ausrufezeichen-Taste prellt irgendwie...
Aber jetzt ists mir klar. Schliesslich muss man den Hinweisen ja nicht nachgehen, nachdem man ein Post hier abgesetzt hat. Da kann man sich dann hinsetzen und warten, bis jemand ne Lösung für einen erarbeitet.
Egal. Auch hier gilt wieder einmal mehr: Neues Thema, neuer Thread.
-junix
-
Darf ich nochmal anmerken, dass die WinApi-Funktionen FindFirst/-NextFile besser zum Suchen nach nur einem Dateinamen sind? Das geht nämlich schneller. Die VCL-Funktionen sind nur dann geeignet, wenn die Datei zusätzlich noch ein bestimmtes Dateiattribut haben soll. Wer's nicht glaubt, schaut im VCL-Code nach.