Woodstock Geschrieben 7. November 2001 Geschrieben 7. November 2001 Gibt es in C/C++ einen Befehl mit dem ich die Festplatte nach bestimmten Dateitypen durchsuchen lassen kann? Bine Zitieren
Klotzkopp Geschrieben 7. November 2001 Geschrieben 7. November 2001 Du kannst mit FindFirstFile und FindNextFile unter Win32 ein bestimmtes Verzeichnis nach Dateien durchsuchen, wobei Du auch Wildcards (*,?) angeben kannst. Um die Rekursion der Verzeichnisse wirst Du Dich aber wohl oder übel selbst kümmern müssen. Zitieren
Klotzkopp Geschrieben 7. November 2001 Geschrieben 7. November 2001 Noch eine Möglichkeit: Lass "dir" (bzw. "ls") die Arbeit tun, leite die Ergebnisse in eine Datei um, die Du dann einliest. system( "dir c:\\*.xyz /s > find.txt" ); Zitieren
Crush Geschrieben 7. November 2001 Geschrieben 7. November 2001 system( "dir c:\\*.xyz /s > find.txt" ); Ist eine gute Lösung, aber wäre es nicht möglich, den find.txt direkt in einen CString oder ähnliches einlesen zu lassen (ohne größeren Aufwand)? Zitieren
mst Geschrieben 8. November 2001 Geschrieben 8. November 2001 Vielleicht mit einer Umleitung der Ausgabe: Umleitung der Standart-Ausgabe . Zitieren
Woodstock Geschrieben 14. November 2001 Autor Geschrieben 14. November 2001 Wie genau muss ich 'findfirst' und 'findnext' verwenden? Ich finde die MSDN da ziemlich verwirrend :confused: . Bine Zitieren
DocMabuse Geschrieben 14. November 2001 Geschrieben 14. November 2001 In etwa so: int done = 0; struct ffblk ffblk; done = findfirst("c:\\*.*",&ffblk,0); // Bricht ab, wenn keine weiteren Dateien gefunden wurden while (!done) { //Hier solltest Du irgendwas machen, z.B. eine Ausgabe cout<<ffblk.ff_name; done = findnext(&ffblk); } Das struct "ffblk" beinhaltet meines Wissen noch andere Informationen (ausser dem Dateinamen). Den Pfad kannst Du auch variabel halten. Also: "findfirst" zuerst benutzen, für alle weiteren Dateien "findnext". Grüsse! DocMabuse Zitieren
Woodstock Geschrieben 14. November 2001 Autor Geschrieben 14. November 2001 Also sehe ich das richtig, das ich eine Variable definiere der ich das Ergebnis der Suche zuweise? Wenn ja, kann ich dann auch ein Array definieren welches ich auch mit den weiteren Sucherfolgen 'zupacke'? Mit der Adresse? Kann ich nur die Adresse des Files herausbekommen, oder auch nur den Namen (mit bzw. auch ohne Formatangabe?). Was bedeutet das 'struct'? Ist es die Anweisung was er mir als Ergebnis liefern soll? 'c:\\*.*' sucht nach jedem x-beliebiegen File welches auf c:\ liegt, richtig? Ordner und Unterodner durchsucht er in diesem Fall aber doch nicht, oder? Wie mache ich das mit dem 'findnext'? Einfach wie mit findfirst? Weiß er dann von ganz alleine das ich schon ein File gefunden habe? Fragen über Fragen und am Anfang alles so kompliziert. Sorry wenn ich ich so viel frage, aber ich will es nicht einfach machen, sondern ich möchte es verstehen. Bine Zitieren
DocMabuse Geschrieben 14. November 2001 Geschrieben 14. November 2001 Zuerstmal brauchst Du Dich nicht zu entschuldigen, wenn Du fragst um etwas zu verstehen. Das nimmt Dir hier bestimmt keiner übel und ich erst recht nicht! Einfaches "Copy+Paste" ist bei sowas einfach nicht angebracht. <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Also sehe ich das richtig, das ich eine Variable definiere der ich das Ergebnis der Suche zuweise? Wenn ja, kann ich dann auch ein Array definieren welches ich auch mit den weiteren Sucherfolgen 'zupacke'? Zitieren
Woodstock Geschrieben 14. November 2001 Autor Geschrieben 14. November 2001 Hmm, schon besser, aber so ganz habe ich das immer noch nicht (dafür weiß ich es dann später um so besser, wenn ich es dann einmal verstanden habe). Ok, was jetzt wenn ich findfirst benutze um damit eine Datei zu füllen aus der dann später entnehmen will welche Dateien auf der Festplatte mit meinem Suchprogramm durchsucht werden sollen?!? (Wenn Du nicht weißt worum es in meinem Projekt geht, sag's und ich erklär es Dir nochmal kurz, oder ließ Dir die anderen Themen durch (was allerdings was länger dauern könnte)). 'Findfirst' und auch 'findnext' geben beide einen int Wert zurück, je nach dem ob etwas gefunden wurde oder nicht. Soweit so gut, nur will ich das ja auch benutzen wenn ich etwas gefunden habe. Wie das? Oder tut das struct das schon für mich? Also, es gibt vorgefertigte struct, was für mich bedeutet (zumindest am Anfang), die kann ich benutzen und muss ich nicht neu scheiben. Steht in der MSDN drin welches Struct für was ist? Das mit den Ordnern und Unterordnern muss ich dann also rekursiv machen, gell? Bine Zitieren
DocMabuse Geschrieben 14. November 2001 Geschrieben 14. November 2001 Mal sehen ob ich das jetzt richtig verstehe: Du willst also Dateien suchen, und wenn Du sie gefunden hast die Namen in einer Datei abspeichern, um sie später wieder einlesen und verarbeiten zu können. So in etwa? Das struct, welches Du am Anfang anlegst (bzw. deklarierst mit: struct ffblk ffblk wird von den Funktionen "find..." beschrieben. Der Intergerwert, den die Funktionen zurückgeben kannst Du höchstens zur Fehlerkontrolle/-abfrage nutzen. In dem struct befinden sich immer die Daten, der aktuell gefundenen Datei. Wenn Du das nicht sicherst (Datei schreiben oder Array) sind die Daten beim nächsten Mal weg und es befinden sich die Daten der nächsten Datei darin. Das struct selbst zu definieren müsste möglich sein, macht aber keinen Sinn da die Funktionen "find..." genau den Aufbau dieses vorgefertigten structs benötigen. Also nimm auf jeden Fall das ffblk. Wenn Du die Namen der Dateien in eine andere Datei speichern willst, solltest Du nicht vergessen, auch den absoluten Pfad mitzuspeichern. Diese Info findes Du in der "const char *pathname", der Übergabewert von "findfirst". Über Unterverzeichnisse habe ich mir noch keine Gedanken gemacht. Rekursiv hört sich natürlich schon mal gut an, aber Du musst bedenken, dass die Funktion "findfirst" immer eine Pfadangabe braucht (als Übergabewert). Du müsstest das also per Hand machen, aber was wäre, wenn Unterverzeichnisse hinzukommen oder wegfallen etc. Dann muss der Quelltext geändert werden. Ist wohl dann nicht die Beste Lösung. Eine Möglichkeit besteht natürlich darin, den Befehl von Klotzkopp zu nehmen ("system...") und damit eine Auflistung aller Dateinamen auf der Festplatte in eine Datei zu schreiben. Diese könnte man dann nach den Dateinamen durchsuchen. Falls Du schon einen Suchalgorithmus geschrieben hast, ist das eine Sache von wenigen Minuten (damit meine ich das Implementieren und nicht das durchsuchen ).Das Problem dabei ist, dass der Befehl in Kombination mit "dir" keine versteckten Dateien anzeigt (mit Attribut h). Besser wäre die Lösung: system("attrib c:\\*.* /s >find.txt); Hier werden auch die versteckten Dateien aufgelistet. Jetzt habe ich wieder so viel geschrieben, dass ich selbst nicht mehr weiß, welche Fragen ich wirklich beantwortet habe. Falls etwas unklar ist, einfach noch mal nachhaken... DocMabuse Zitieren
Woodstock Geschrieben 15. November 2001 Autor Geschrieben 15. November 2001 Hört sich soweit nicht schlecht an, muss ich halt erstmal versuchen umzusetzten. Eine Frage habe ich aber schon noch. Wie kann ich denn nun das File mit Pfadangabe in einem Array speichern. Mit strcpy? Und wenn ja, was ist die Quelle von der ich das Kopiere? Sabine Zitieren
DocMabuse Geschrieben 15. November 2001 Geschrieben 15. November 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock: <STRONG>... Wie kann ich denn nun das File mit Pfadangabe in einem Array speichern. Mit strcpy? Und wenn ja, was ist die Quelle von der ich das Kopiere? ...</STRONG> Zitieren
Woodstock Geschrieben 15. November 2001 Autor Geschrieben 15. November 2001 Gibt es eine bestimmte header-Datei die ich für struct includen muss? Weil so klappt es nicht. Bine Zitieren
DocMabuse Geschrieben 15. November 2001 Geschrieben 15. November 2001 Versuch's mal mit der <dir.h>! Müsste dann eigentlich funktionieren. DocMabuse Zitieren
Woodstock Geschrieben 15. November 2001 Autor Geschrieben 15. November 2001 Gibt es bei mir nicht (Fehler beim compilen). Kannst Du mir die per Mail schicken? Bine Zitieren
Woodstock Geschrieben 19. November 2001 Autor Geschrieben 19. November 2001 Hmm, also ich komme damit einfach nicht weiter, kann mir hier noch mal jemand helfen, so Stück für Stück? Wäre Euch sehr dakbar. Bine Zitieren
Woodstock Geschrieben 19. November 2001 Autor Geschrieben 19. November 2001 Kann mir vielleicht jemad die dir.h per Mail schicken, weil ich finde die im Netz nicht, habe sie nicht bei meinen Standard-Headers brauche sie aber. Biiiiiiite?!?! Bine Zitieren
DocMabuse Geschrieben 19. November 2001 Geschrieben 19. November 2001 Hm, ist die Mail nicht angekommen??? Grüsse! DocMabuse Zitieren
Woodstock Geschrieben 19. November 2001 Autor Geschrieben 19. November 2001 Nee, bis jetzt nicht. Versuchs nochmal bitte. Bine Zitieren
Woodstock Geschrieben 19. November 2001 Autor Geschrieben 19. November 2001 @ DocMabuse: Esrtmal danke, aber ich kann damit immer noch nichts anfangen, weil er auf andere Header-Dateien zugreifen will, welche bei mir auch nicht vorhanden sind (ich weiß auch nicht wiedo, ist das irgendwie ein besonderes Paket oder so, weil meine Programmierumgebung ist ja ganz normal eine Vollversion und ganz normal installiert). Bine Zitieren
DocMabuse Geschrieben 19. November 2001 Geschrieben 19. November 2001 Hm, ich hatte befürchtet, dass es mit der Datei nicht getan ist. Ich nutze hier den Borland C++Builder 5.0. Das Verzeichnis mit den Header-Files umfasst ca. 95 MB in ca. 1200 Dateien. Kann jetzt leider auf Anhieb nicht genau sagen, welche noch fehlen. Es ärgert mich nur, dass ich Dir jetzt nicht weiterhelfen kann. Sorry! Grüsse! DocMabuse Zitieren
Woodstock Geschrieben 20. November 2001 Autor Geschrieben 20. November 2001 Nun, also ich habe mit meinem Chef gesprochen, er meint ich soll das struct '_finddate_t' benutzen. Kennst Du das? Also er gibt Dir da zwar auch den Namen der Datei die er findet, aber nicht die Pfadangabe dazu. Wie kann ich ihn dazu bringen das er mir die dazu gibt? Weil ich mich ja dann in dem Verzeichniss befinde in dem die Datei liegt :confused: !?!? Und wie kann ich das mit dem wechseln in die Unterverzeichnisse machen (rekursiv), und wie kann ich ihm überhaupt klar machen das er zwischen Verzeichnissen und Dateien unterscheiden soll, und wie? Hiiilfe.... Bine Zitieren
DocMabuse Geschrieben 20. November 2001 Geschrieben 20. November 2001 Du meinst vermutlich das struct '_finddata_t'. Ich habe selbst noch nicht damit gearbeitet, es scheint aber auch ein vorgefertigtes struct zu sein. Dieses struct kannst Du, soweit ich weiß mit dem Befehl '_findfirst' befüllen. Hier mal die Syntax des Befehls: <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR> Syntax #include <io.h> long _findfirst(char *filter, struct _finddata_t *fileinfo); #include <io.h> #include <wchar.h> long __wfindfirst(wchar_t *filter, struct _wfinddata_t *fileinfo); Beschreibung Diese Funktionen starten in einem Verzeichnis die Suche nach dem ersten Vorkommen eines Dateinamens, der dem angegebenen Filter entspricht Der Parameter filter ist ein String, der angibt, welche Dateien zurückgegeben werden sollen. Platzhalter sind erlaubt. Der Parameter fileinfo ist der Puffer für die Dateiinformationen. Wenn eine passende Datei gefunden wird, wird die Struktur fileinfo mit den entsprechenden Informationen gefüllt. Die Funktionen dienen der Microsoft-Kompatibilität. Rückgabewert Im Erfolgsfall wird ein eindeutiges Handle zu einer Datei oder Dateigruppe zurückgegeben, die der Filterbedingung entspricht. Andernfalls geben die Funktionen -1 zurück und setzen errno auf einen der folgenden Werte: ENOENT Pfad oder Dateiname nicht gefunden EINVAL Ungültiger Dateiname Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.