FindFirstFile
-
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?
-
Findet: "test.txt" und "xxx.txtxx"
#include <windows.h> #include <conio.h> #include <stdio.h> char *fbprint(char *format, ...) { static char buf[1000]; vsnprintf(buf, sizeof(buf), format, (&format)+1); return (char *)buf; } void dirsearch(char *path, char *filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; hFindFile = FindFirstFile(fbprint("%s\\%s", path, filter), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) printf("%s\\%s\n", path, wfd.cFileName); while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } } int main() { dirsearch("c:", "*.txt*"); /* Pfad und Maske festlegen */ getch(); return 0; }
-
Geht leida nicht kommt folgende Fehlermeldung:
C:\Dokumente und Einstellungen\Dennis\Eigene Dateien\Unbenannt1.cpp In function `char* fbprint(char*, ...)':9 C:\Dokumente und Einstellungen\Dennis\Eigene Dateien\Unbenannt1.cpp cannot convert `char**' to `char*' for argument `4' to `int vsnprintf(char*, size_t, const char*, char*)'
-
Eigentlich sollte man "va_arg" verwenden, aber bei mir funktioniert es auch so.
Da wirst Du wohl oder übel casten müssen:
vsnprintf(buf, sizeof(buf), format, (char *)((&format)+1));
-
Aber da werden gar nicht die Unterverzeichnise mit dursucht
-
Und warum kann man nicht
strcat (path, "\\"); strcat (path,wfd.cFileName);
nemmen???
Weil da kommt immer eine Fehlermeldung
-
Get XxX schrieb:
Fehlermeldung
Nächste Woche fahre ich in die Stadt und kaufe mir ein Kopftuch und eine Glaskugel.
-
Fehlermeldung (Syntax Error before strcat)
-
Anbei zwei Funktionen - hier in MFC eingebettet, aber im Wesentlichen WinAPI - die erste zählt die Files - auch in Subdirectories - die zweite kopiert das gesamte Verzeichnis incl. Subdirectories.
..