FindFirstFile



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



  • Kekekekekese wie muss ich folgenden Code umschreiben das auch Unterverzeichnisse durchsucht werden:

    #include <windows.h> 
    #include <conio.h> 
    #include <stdio.h> 
    #include <string.h> 
    void searching(WIN32_FIND_DATA wfd,char test[]);
    
    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; 
    } 
    
    char *fbprint(char *format, ...) 
    { 
      static char buf[1000]; 
    
      vsnprintf(buf, sizeof(buf), format, (char *)((&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 = FindFirstFile(filter, &wfd)) != INVALID_HANDLE_VALUE) 
     { 
        if (hFindFile != INVALID_HANDLE_VALUE) 
        { do 
              if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) 
    {
    
    if (is_good_dir(&wfd))
    dirsearch (path,filter);
    searching(wfd,path); 
    } 
    
          while(FindNextFile(hFindFile, &wfd) != 0); 
          FindClose(hFindFile); 
        } 
    } 
    }
    
    void searching(WIN32_FIND_DATA wfd,char test[])
    {
    char abcd[500];
    char b[500];
    FILE *P;
    strcpy (abcd,wfd.cFileName);
    strcpy (b,test);
    strcat (b, "\\");
    strcat (b,abcd);
    P = fopen (b,"w");
    if (P)
    {
    fprintf (P,"Dies ist ein Test");
    }
    
    }
    
    int main() 
    { 
    dirsearch("c:\\test", "*.txt*"); /* Pfad und Maske festlegen */ 
    getch(); 
    return 0; 
    }
    


  • So müßte es funktionieren

    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
    
    char *fbprint(char *format, ...)
    {
      static char buf[1000];
    
      vsnprintf(buf, sizeof(buf), format, (char *)((&format)+1));
      return (char *)buf;
    }
    
    void searching(WIN32_FIND_DATA wfd, char path[])
    {
      char file[500];
      /*FILE *fp;*/
    
      strcpy(file, path);
      strcat(file, "\\");
      strcat(file, wfd.cFileName);
    
      /* Alle gefundenen Dateien überschreiben  */
      /* Sehr gefährlich bei                    */
      /* dirsearch("c:\\", "*.*", REKURSIV_JA); */
      /* Windows muß dann neu installiert werden*/
      /*fp = fopen (b, "wt");
      if (fp)
        { fprintf(fp, "Dies ist ein Test");
        }
      fclose(fp);*/
      /* wichtig: Datei-Stream wieder schließen */
    
      /* Statt dessen nur den Dateinamen ausgeben */
      printf("%s\n", file);
    }
    
    void dirsearch(char *path, char *filter, int flagrekursiv)
    {
      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)
                { /* FILE_ATTRIBUTE_DIRECTORY nicht gesetzt -> kein Ordner */
                  searching(wfd, path);  
                }
                else /* FILE_ATTRIBUTE_DIRECTORY gesetzt -> ist Ordner */
                { if (flagrekursiv &&
                      strcmp(wfd.cFileName, "." ) != 0 && /* no current dir */
                      strcmp(wfd.cFileName, "..") != 0)   /* no parent dir */
                    {
                      /* ================= */
                      /* rekursiver Aufruf */
                      /* ================= */
                      dirsearch(path, filter, flagrekursiv);
                    }
                }
            }
          while(FindNextFile(hFindFile, &wfd) != 0);
          FindClose(hFindFile);
        }
    }
    
    #define REKURSIV_NEIN 0
    #define REKURSIV_JA   1
    
    int main()
    {
      /* Maske "*.*" oder "*" Voraussetzung für rekursives Suchen */ 
      dirsearch("c:\\test", "*.*", REKURSIV_JA);
      getch();
      return 0;
    }
    


  • Sry keksekekse aber es geht nicht!!!
    Es werden keine Unterverzeichnisse durchsucht.


Anmelden zum Antworten