[C++] Datei auf dem Computer suchen

hemorieder

Lieutenant
Registriert
März 2003
Beiträge
652
Hi,

ich wollte mal fragen ob es eine möglichkeit gibt in c++ nach einer datei auf dem ganzen Computer zu suchen. Bei google hab ich noch nix gefunden. Wäre cool wenn ihr was wüsstet.

Gruß hemorieder
 
danke, nur kann mir einer sagen wie ich das einbinde ? Ich kann mir das aus dem tut nich erlesen, sagen wir mal ich suche die datei text.txt wie muss dann der code aussehen ?
 
Code:
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;

  printf ("Target file is %s.\n", argv[1]);
  hFind = FindFirstFile(argv[1], &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE) 
  {
    printf ("Invalid File Handle. GetLastError reports %d\n", 
            GetLastError ());
    return (0);
  } 
  else 
  {
    printf ("The first file found is %s\n", 
            FindFileData.cFileName);
    FindClose(hFind);
    return (1);
  }
}

Das ist der Beispielcode und der funktioniert auch schon. Er sucht immer die erste Datei die er findet. Und dann musst du mit der Funktion FindNextFile oder so ähnlich weitersuchen.

Bei FindNextFile gibst du ihm einfach als vorherige file die FindFileDate Ergebnisse.

Gruß Andy
 
wenn ich das in mein Visual Studio 2005 Pro kopiere geht der code nicht, und wo gebe ich an wonach ich suchen will ?
 
Das Script erwartet einen Parameter. Der müss beim ausführen mit angegeben werden sollst haut der dir ein paar hässliche Fehler um die Ohren:

Code:
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;
  if(argc < 1) {
    printf("Bitte rufen sie die Datei wie folgt auf: datei.exe \"dateiname.endung\"");
    exit -1;
  }
  printf ("Target file is %s.\n", argv[1]);
  hFind = FindFirstFile(argv[1], &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE) 
  {
    printf ("Invalid File Handle. GetLastError reports %d\n", 
            GetLastError ());
    return (0);
  } 
  else 
  {
    printf ("The first file found is %s\n", 
            FindFileData.cFileName);
    FindClose(hFind);
    return (1);
  }
}
 
tut mir leid, entweder bin ich zu blöd, oder blind, aber wo schreib ich jetzt überall den dateinamen hin ? meinst du, du kannst einfach mal nach "text.txt" suchen ?
 
was ist an dieser zeile
Code:
printf("Bitte rufen sie die Datei wie folgt auf: datei.exe \"dateiname.endung\"");
so schwer zu verstehen?
 
hemorieder schrieb:
wenn ich das in mein Visual Studio 2005 Pro kopiere geht der code nicht, und wo gebe ich an wonach ich suchen will ?

Vielleicht solltest du mit etwas "leichterem" anfangen.
Anscheinend hast du keine große Erfahrung mit C++, eher mit BitTorrent :p:p:p.

Also:
1. Dieses Forum ersetzt kein c++ bzw. MSVC Tutorial, kauf dir dazu lieber ein Buch
2. c++ ist meiner Meinung nach KEINE Einsteigersprache
3. Diese Aufgabe kann man einfacher mit anderen Mitteln und Sprachen umsetzen.
 
Ok also anscheind muss ich mal was klarstellen, 1. ich habe seit 2 jahren c++ im Leistungskurs fürs abi, also ahnung hab ich schon. 2. ist das eine partnerschule von microsoft und wir kriegen die software gratis. 3. check ich den code nicht, weil ich nicht weiss wo ich den dateinamen hinschreiben soll, wir arbeiten nur mit cout und nich mit printf. ich wollte doch einfach nur wissen wo ich genau text.txt hinschreiben muss damit es geht.
 
Code:
printf("Bitte rufen sie die Datei wie folgt auf: datei.exe \"dateiname.endung\"");
du rufst das programm mit dem parameter datei.endung auf... was verstehst du daran nicht?
 
also quasi:

...
if(argc < 1) {
printf("text.txt");
exit -1;
...


so wird doch nur text.txt geschrieben !

compilieren kann ich auch nix, weil immer ein fehler kommt, wie soll ich da was an exe hängen, wenn es keine exe gibt ?
 
Zuletzt bearbeitet:
mach mal in zeile 12 aus dem
Code:
exit -1;
ein
Code:
exit (-1);
, dann lässt es sich kompilieren, oder kriegst du einen anderen fehler?
 
Code:
#define _WIN32_WINNT 0x0400
#include <iostream>
#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;
  if(argc < 1) {
    printf("text.txt");
    exit (-1);
  }
  printf ("Target file is %s.\n", argv[1]);
  hFind = FindFirstFile(argv[1], &FindFileData);   // hier ist der fehler 
  if (hFind == INVALID_HANDLE_VALUE) 
  {
    printf ("Invalid File Handle. GetLastError reports %d\n", 
            GetLastError ());
    return (0);
  } 
  else 
  {
    printf ("The first file found is %s\n", 
            FindFileData.cFileName);
    FindClose(hFind);
    return (1);
  }
}

Fehler:

1>c:\visual studio 2005\projects\finden\finden\finden.cpp(16) : error C2664: 'FindFirstFileW': Konvertierung des Parameters 1 von 'char *' in 'LPCWSTR' nicht möglich
1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
 
hm, also mit visual c++ 6.0 geht das.
 
LPCWSTR ist ein Wide String. D.h. vermutlich ist in Deinen Projekteinstellungen UNICODE definiert. Wenn Du das deaktivierst, könnte es eventuell gehen.

Wobei das hier vermutlich auch stören könnte bzw. überflüssig ist.

Code:
#define _WIN32_WINNT 0x0400

MfG

Arnd
 
hemorieder schrieb:
Ok also anscheind muss ich mal was klarstellen, 1. ich habe seit 2 jahren c++ im Leistungskurs fürs abi, also ahnung hab ich schon. 2. ist das eine partnerschule von microsoft und wir kriegen die software gratis. 3. check ich den code nicht, weil ich nicht weiss wo ich den dateinamen hinschreiben soll, wir arbeiten nur mit cout und nich mit printf. ich wollte doch einfach nur wissen wo ich genau text.txt hinschreiben muss damit es geht.

Zu 1:
Das du 2 Jahre Erfahrung hast habe Ich befürchtet!
An deiner Stelle würde ich das Fach SOFORT abwählen und Erdkunde nehmen.
Alternativ verklage deinen Lehrer wegen sexueller Belästigung :D .

Zu 2:
Der Beispielcode :
- verwendet Microsoft's Windows Api
- ist 1 zu 1 von der MSDN Homepage kopiert (auch Microsoft)
- läuft nicht im MS Visual Studio 2005
- wird von einem MS Partnerschulen Schüler versucht zu kompilieren

HAHAHA, wem geben wir die Schuld ?

Naja, ganz so schlimm ist es nicht!
Das mit der Unicode-Unterstützung deaktivieren stimmt.

Zu 3:
Das TEXT.TXT gehört nicht in das printf :evillol:
Kleiner tip: text.txt gehört NICHT in den Quellcode !
Frag deinen Lehrer mal, was ein Programm-Parameter und eine Kommandozeile ist
und wie man die benutzt.

Der Code wird übrigens noch nicht das tun, was du willst.
Für deine Lösung muss er erweitert werden!
 
Zum Thema Info-LK: Mein Info-GK Lehrer ist zufällig aktiver Linux Programmierer (Kile) und mit dem waren wir ende 12.1 mit dem Stoff fertig der für einen LK bis zur 13 vorgesehen ist *g*
Allzuviel einbilden auf das schöne wörtchen LK würde ich also nicht. Wirklich was lernen tust du da nicht. Das muss von dir selber kommen...

Und dass du den Code nach 2 Jahren LK nicht verstehst verdeutlicht meine Aussage nur
 
Bei uns gibt es nicht mal nen Info LK :(

Aber so wie es aussieht ist das auch nicht weiter schlimm :D

Wobei ich lieber C++ als Delphi machen würde.

Da es hier noch nicht erklärt wurde schreib ich es mal:

Code:
int main(int argc, char *argv[])

ist etwas anderes als

Code:
int main()

Und zwar besteht der Unterschied darin, dass bei der ersten Variante Parameter übergeben werden können. ( nicht müssen ). Also ganz analog zu stinknormalen Funktionen.

argc ist die Anzahl der Parameter und im Array argv sind diese schließlich gespeichert.

Parameter übergen kannst du zB über die Konsole wenn du dein Programm mit 'test.exe parameter1 parameter2' aufrufst.

Sollte eigentlich jedem bekannt sein aber da es nicht so aussieht hoffe ich, dass ich ein wenig Licht ins Dunkel bringen konnte.
 
Zurück
Oben