FindFirstFile
-
also bei micht closed sich des programm von ganz alleine und eine fehlermeldung kommt.
und wie kann man des so machen das .txt files gesucht werden und auch die unterordner=?
-
Dry Gin schrieb:
und eine fehlermeldung kommt.
Was sagt die Fehlermeldung denn?
-
Projekt1.exe hat ein problem festgestellt und muss beendet werrden und wenn ich mit dem debugger drann gehe kommt folgende fehlermeldung:
Eine Zugriffverltetzung (Segmentation Fault) trat in ihrem PRogramm auf
-
In so einer Lage verteile ich wild im Quelltext printf-Anweisungen:
printf("[A]"); ... printf("[B]"); ... printf("[C]");
und spare mir sogar den Debugger
Ausgabe:
[A][B] (dann Fehlermeldung)
printf("[B ptr %p]", ptr);
[B ptr 00000000] (dann Fehlermeldung)
Schon ist die Sache klar
Ähm, auf welche Zeilennummer verweist der Debugger? Aber schreib jetzt nicht: Zeile 58
-
auf die zeile
rekursiv("c:");
und wie suche ich nach dateien mit bestimmten namen?
-
Also SUCHEN tust Du indem Du char mask[MAX_PATH] anpasst "." (Alles) "*.txt" (Textdateien mit der Endung .txt) "project." (projekt.prj, projekt.dat, projekt.xxx)
Und FINDEN, indem Du wfd.dwAttributes (Directory oder nicht) und wfd.cFileName (stricmp) nach Deinen Parametern vergleichst.
Poste mal Deinen Quelltext
-
ok läuft jetzt alles super habe alels hingekriegt,
aber noch ein problem habe ich ich möchte auf der d:\ nach einer datei mit dem namen Test.txt suchen die datei wird auch gefunden dann soll in die datei geschrieben werden,dies klappt auch,aber dann wird immer und immer weiter darein geschrieben fast so wie eine schleife dabei habe ich keine schleife eingebaut habe nix verändert oder sonst (an deinem code)
-
Also rekursive Funktionen haben den Nachteil, daß sie ziemlich gierig sind, wenn man sie nicht bremst.
int rekursiv(void) { int var; rekursiv(); /* nach einigen tausend Aufrufen läuft der Stack */ /* mit 4 Byte 'var' und 4 Byte Rücksprungadresse über */ }
Ich vermute mal, daß Du innerhalb der FindFileFirst- und FindFileNext-Schleife in die Datei schreibst. So oft wie die Schleife durchlaufen wird, wird in die Datei geschrieben.
Wie gesagt, ein paar oder mehrere Codezeilen könnten die Sache wesentlich erhellen.
-
stimmt hast recht ich schreibe wärend der schleife in die datei,aber was komisch ist wenn die .txt im gleichen ordner wie meine gesuchte datei ist dann klappt es prima
-
Wenn Du den Code (*.exe) im Ordner "C:\\path" aufrufst
if ((fp = fopen("c:\\path\\src\\test1.txt", "wt")) != 0) { fclose(fp); if ((fp = fopen("test2.txt", "wt")) != 0) fclose(fp); }
dann wird test2.txt nicht in "C:\\path" eröffnet, sondern in "C:\\path\\src"
Darum ist es immer besser, mit absoluten Pfaden zu arbeiten (oder sich auf den Ordner zu beschränken, von der die *.exe-Datei aufgerufen wird).
-
aber dies hilft mir ja nicht wirklich bei meinem problem
wie kann ic den dies machen das sich nicht dauernt die funktion wiederholt
weil in einem anderen projekt geht es auch
-
Um aus einer Schleife rauszukommen gibt es das Schlüsselwort 'break', aber das ist schon ganz schwer Grundlagenwissen.
int i; for (i = 0; i < 10; i++) { if (i > 5) break; printf("%i\n", i); }
-
hey...könntest du nochmal den code posten??also mit ordner und unterordner suche?wäre nett dry gin..danke
-
void DoSomething(char *path, char *fname) { char filename[MAX_PATH]; snprintf(filename, sizeof(filename), "%s\\%s", path, fname); printf("DoSomething %s\n", filename); /* irgendwas mit filename machen */ } void DoSomething2(char *path, char *fname) { char filename[MAX_PATH]; snprintf(filename, sizeof(filename), "%s\\%s", path, fname); printf("DoSomething2 %s\n", filename); /* irgendwas ... */ } void nichtrekursiv(char *path) { char mask[MAX_PATH]; HANDLE hFindFile; WIN32_FIND_DATA wfd; char result[MAX_PATH]; sprintf(mask, "%s\\*.*", path); if ((hFindFile = FindFirstFile(mask, &wfd)) != INVALID_HANDLE_VALUE) { do { /* Möglichkeit 1 */ if ((wfd.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) if (stricmp(wfd.cFileName, "test.txt") == 0) /* dateiname ok? */ { DoSomething(path, wfd.cFileName); break; /* fertig, Schleife verlassen */ } /* und/oder Möglichkeit 2 */ if ((wfd.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) if (strlen(wfd.cFileName) >= 2 && strnicmp(wfd.cFileName, "ab", 2) == 0) /* beginnt dateiname */ { DoSomething2(path, wfd.cFileName); /* mit "ab..."? */ /* hier kein 'break' Schleife endet mit automatisch */ } } while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } }
-
int is_good_dir(WIN32_FIND_DATA *wfd) { if (strcmp(wfd->cFileName, ".") == 0) return 0; if (strcmp(wfd->cFileName, "..") == 0) return 0; return (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; }
Für das Ganz rekursiv aufzumotzen muß nur die Schleife an irgendeiner Stelle so ergänzt werden:
sprintf(result, "%s\\%s", path, wfd.cFileName); printf("%s\n", result); if (is_good_dir(&wfd)) nichtrekursiv(result);
-
em kekese ich habe eine funktion geschrieben die wird dann immer aufgerufen wenn eine datei gefunden wurde in diese wird dann geschrieben aber ich kann ja net in der funktion das schlüssel wort break nemmen.
Kannste bsp. zeigen mit bestimmter endung suchen?
-
Möglichkeit 1:
if ((wfd.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) if (strlen(wfd.cFileName) > 4 && strnicmp(wfd.cFileName+strlen(wfd.cFilename)-4, ".txt", 4) == 0) DoSomething(path, wfd.cFileName);
Möglichkeit 2:
void DoSomething(char *path, char *fname) { if (strlen(fname) > 4 && strnicmp(fname+strlen(fname)-4), ".txt", 4) == 0) { /* do something */ } } if ((wfd.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) DoSomething(path, wfd.cFileName);
-
könnte man nicht einfach Dateien mit bestimmmter Endung so suchen:
if (strcmp(wfd->cFileName, "*.txt*") == 0)
-
Der Parameter mask von FindFirstFile(char *mask, ...); kann sogenannte wildcards (die Zeichen '*' und '?') enthalten. Dann bekommst Du mit "*.txt" nur Datei- und Unterverzeichnisnamen nach wfd.cFileName geliefert, die "test.txt" oder "xxx.txt" oder "xx.test.xx.txt" lauten.
strcmp(char *s1, char *s2) hingegen vergleicht s1 und s2 Zeichen für Zeichen. Wenn alle Zeichen und die Stringlänge gleich sind, wird 0 zurückgeliefert, ansonsten -1 oder +1.
siehe google "strcmp"
-
Hä keksekekse wie sucht man .*txt* Dateien?