Zum Inhalt springen

Festplatte durchsuchen lassen?


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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)?

Geschrieben

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

Geschrieben

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

Geschrieben

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'?

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

<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>

Geschrieben

@ 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

Geschrieben

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

Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...