Zum Inhalt springen

Dateien suchen mit Findfirstfile?


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe die Aufgabe ein Porgramm schreiben, welches in einem Verzeichnis, dass möglichst per Abfrage des Benutzers eingegeben wird, nach Dateinamen sucht. Eigentlich nach .jpeg und .jpg.

Ich bin noch nicht sehr erfahren und kann auch nur Standard C++. Und selbst das noch nicht mal komplett. Aber es kommt langsam.:)

Ich habe schon gegoogelt und hier die Suchfunktion benutzt. Ganz so klar komme ich aber noch nicht mit.

Brauche ich für Findfirstfile die MFC Bibliothek? Oder eine andere?

Kann ich das Ergebnis durch einfaches zuweisen in einer Variable speichern?

Was ich bisher so an Code gesehen habe, war der Pfad immer im Quellcode miteingegeben. Es muss aber vom Benutzer eingegeben werden. Kann ich dann den ermittelten Pfadnamen auch in einer Variable speichern?

Wenn jemand vielleicht auch ein kleines Beispielprogramm schreiben könnte, dann wäre das super. Oder hat vielleicht jemand einen Link mit einer guten Erklärung zu diesem Thema? Aber von Anfang an. Also auch welche Bibliotheken ich benötige.

Ich bedanke mich im Vorraus für jede Antwort.

Geschrieben

Danke für deine schnelle Antwort.

Nein die MFC brauchst du dazu nicht, FindFirstFile ist ganz normale Windows API. Die Beste Anlaufstelle dazu ist immer die MSDN, da findest du die Funktionen genau Dokumentiert und oft auch BEispiele dazu

FindFirstFile Function (Windows)

Die MSDN werde ich mir mal angucken. Bei MSDN habe ich mir CFileFind mit MFC angeschaut aber nicht richtig durchgeblickt. Werds aber hoffentlich bei FindFirstFile.

Findest du doch schon wenn du hier nach FindFirstFile suchst ;)

Ja das stimmt. Habe ja auch welche gefunden, aber funktioniert haben die bei mir nicht und erklärt wurden die auch nciht ganz vollständig. Und dadurch weiß ich dann auch gar nicht was ich da überhaupt gemacht habe.

Hatte gedacht, ich müsste noch irgendwelche Dateien includen. Aber wie du schon sagtest, brauch ich das ja nicht.

Der Compiler spuckt bei fast jeder Zeile einen Fehler aus. Es beginnt bei "HANDLE undeclared (first use this function)" und geht bis "FindClose undeclared (first use this function)".

Geschrieben
Das hab ich nicht gesagt. Du musst zumindest mal windows.h includen. Alles weitere steht in der MSDN...

Ach stimmt, tut mir leid. Ich stehe heute wohl irgendwie total auf dem Schlauch.

Danke

Geschrieben

Mit Hilfe der MSDN und einem Beispielcode aus dem Forum bin ich jetzt etwas weiter gekommen. Das Programm sucht schon richtig nach dateien. Nur habe ich jetzt 2 Probleme.

1. Ich muss das Verzeichnis, welches durchsucht werden soll, im Quellcode angeben. Das ist aber unvorteilhaft. Besser wäre es wenn ich das dem Benutzer überlassen könnte. Wenn ich jetzt aber beim Aufruf der Funktion FindFirstFile den ersten Übergabeparameter als Variable nehme, dann spuckt der Compiler den Fehler "invalid conversation from 'char' to 'const char'". Das bedeutet also ich brauch eine Konstante, aber wie kann ich das lösen, damit der Benutzer den Pfad eingeben kann?

2. Ich muss die gefundenen Dateinamen irgendwie abspeichern können. Entwerder temporär nur zur Laufzeit oder auch als Datei. Aber wenn ich die Dateinamen versuche in eine Variable zu speichern, dann bekomme ich den Fehler "invalid conversation from 'CHAR*' to 'char'".

Was ich auch noch gerne machen würde, aber nicht zwingend notwendig ist, ist das Anzeigen der Verzeichnisse, die sich in dem angegebenen Verzeichnis befinden.

Die Abfrage dazu habe ich in eine IF-Anweisung, nur ist in diesem Block kein Code. Wie bekomme ich die Verzeichnisnamen raus? Habe schon in dem struct WIN32_FIND_DATA in der MSDN nachgeschaut, aber nichts dazu gefunden.

Geschrieben
Wenn ich jetzt aber beim Aufruf der Funktion FindFirstFile den ersten Übergabeparameter als Variable nehme, dann spuckt der Compiler den Fehler "invalid conversation from 'char' to 'const char'". Das bedeutet also ich brauch eine Konstante

Du hast die Fehlermeldung falsch oder unvollständig abgeschrieben. Deine Schlussfolgerung ist auch falsch. Zeig mal den Code.

Aber wenn ich die Dateinamen versuche in eine Variable zu speichern, dann bekomme ich den Fehler "invalid conversation from 'CHAR*' to 'char'".
Auch hier ist die Fehlermeldung wieder falsch/unvollständig. Bitte benutz Copy&Paste. Und auch hier musst du den Code zeigen. Ohne den Code kann man nur sagen, dass du etwas falsch machst.
Geschrieben

Okay

Also wenn ich bei FindFirstFile eine Varibale (path) stehen habe, dann zeigt der Compiler für diese Zeile

19 C:\Dev-Cpp\fhandle 1.1.cpp invalid conversion from `char' to `const CHAR*'

und

19 C:\Dev-Cpp\fhandle 1.1.cpp initializing argument 1 of `void* FindFirstFileA(const CHAR*, _WIN32_FIND_DATAA*)'

an.

int main()

{   

    HANDLE fHandle;

    WIN32_FIND_DATA FindFileData; 

    char path;

    cout<<"Geben Sie das Verzeichnis an: ";

    cin>>path;


    fHandle=FindFirstFile(path,&FindFileData);
Für das Abspeichern der Namen in einer Variable gibt es nur diesen einen Fehler: 44 C:\Dev-Cpp\fhandle 1.1.cpp invalid conversion from `CHAR*' to `char' .
FindNextFile(fHandle,&FindFileData); 


    while (FindNextFile(fHandle,&FindFileData)) 

    { 

      if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 

      { 

        cout<<"\n'Ein Verzeichnis'\n\n";

        // Datei ist keine, sondern ein Verzeichnis... 

      } 

      else 

      { 

        //cout<<"Folgende Datei gefunden: "<<FindFileData.cFileName<<"\n";

        char list;

        list=FindFileData.cFileName;  

        cout<<"Folgende Datei gefunden: "<< list <<"\n";

      } 

    } 

    FindClose(fHandle);

    _getch();

    return 0;

}

Könnte man das vielleicht durch Zeiger lösen?:confused:

Geschrieben

In eine char-Variable passt genau ein einzelnes Zeichen. Wenn du mit Zeichenketten arbeiten willst, musst du schon char-Arrays benutzen, oder, da du C++ benutzt, am besten gleich std::string. Diese Klasse kümmert sich für dich um die Speicherverwaltung.

Geschrieben
In eine char-Variable passt genau ein einzelnes Zeichen. Wenn du mit Zeichenketten arbeiten willst, musst du schon char-Arrays benutzen, oder, da du C++ benutzt, am besten gleich std::string. Diese Klasse kümmert sich für dich um die Speicherverwaltung.

Hmm, habe es vorhin auch schon mit arrays versucht. Jetzt nochmal, aber ich bekomm sogar die gleichen Fehlermeldungen. Ich habe einfach immer bei der Variable in eckigen Klammern die Anzahl der arrays geschrieben. Das müsste doch reichen, oder?

Über string weiß ich nichts. hast du vielleicht einen Link, in dem mir schnell und kurz erklärt wird, wie man damit umgeht? Ansonsten müsste ich in meinen Büchern oder ebooks umständlich danach suchen.

Ich gehe zwar meine beiden Bücher nacheinander durch aber so weit bin ich noch nicht. Und da es für die Arbeit ist kann ich damit nicht so lange warten. Weil ich es nämlich für mich privat nicht so hektisch angehe und mir Zeit lasse.

Geschrieben
Hmm, habe es vorhin auch schon mit arrays versucht. Jetzt nochmal, aber ich bekomm sogar die gleichen Fehlermeldungen. Ich habe einfach immer bei der Variable in eckigen Klammern die Anzahl der arrays geschrieben. Das müsste doch reichen, oder?
Nein. Die eckigen Klammern brauchst du nur bei der Deklaration/Definition des Arrays. Später benutzt du die Klammern dann nur noch, wenn du auf einzelne Elemente des Arrays zugreifen willst.

Über string weiß ich nichts. hast du vielleicht einen Link, in dem mir schnell und kurz erklärt wird, wie man damit umgeht?
Nein. Aber ich kann deinen Code mal eben passend umstricken:


#include <string>
using namespace std;

int main()
{
HANDLE fHandle;
WIN32_FIND_DATA FindFileData;
string path;
cout<<"Geben Sie das Verzeichnis an: ";
cin>>path;

fHandle=FindFirstFile(path.c_str(),&FindFileData);

...

FindNextFile(fHandle,&FindFileData);

while (FindNextFile(fHandle,&FindFileData))
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
cout<<"\n'Ein Verzeichnis'\n\n";
// Datei ist keine, sondern ein Verzeichnis...
}
else
{
//cout<<"Folgende Datei gefunden: "<<FindFileData.cFileName<<"\n";
string list;
list=FindFileData.cFileName;
cout<<"Folgende Datei gefunden: "<< list <<"\n";
}
}
FindClose(fHandle);
_getch();
return 0;
}[/code]

Geschrieben

Oh hey, das ist wirklich sehr nett von dir. Danke.:)

Funktioniert super.

Kannst du mir vielleicht noch sagen was es sich mit dem path.c_str() auf sich hat? Weil ich schon verstehen will, was ich dann da habe.

Danke noch mal für Eure Hilfe.

Geschrieben

FindFirstFile erwartet als ersten Parameter einen const char*, und kann mit std::string nichts anfangen. Die Stringklasse bietet allerdings eine Methode an, die einen solchen Zeiger bereitstellen kann, und diese Methode heißt c_str.

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