FindFirstFile



  • kekekese habe alles hinbekommen ausser
    ich habe nach einem ordner gesucht den auch gefunden aber wie kann ich den kompltetten pfad des ordner ausgeben in der funktion int is_good_dir

    so sieht die funktion bei mir aus

    int is_good_dir(WIN32_FIND_DATA *wfd) 
    { 
       if (strcmp(wfd->cFileName, "Knuddels") == 0)
       {
       printf ("\n\n\n\n\n\n\n\n\n");
       printf ("%s\n",Wie kann ich den pfad jetzt ausgeben???); 
    system ("PAUSE");
    }                    
      if (strcmp(wfd->cFileName, ".") == 0) 
          return 0; 
      if (strcmp(wfd->cFileName, "..") == 0) 
          return 0; 
      return (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; 
    }
    


  • - OHNE WORTE -

    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
            { if ((wfd.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
                { sprintf(result, "%s\\%s", path, wfd.cFileName);
                  printf("%s\n", result);
                }
              /*if (is_good_dir(&wfd))
                  rekursiv(result);*/
            }
          while(FindNextFile(hFindFile, &wfd) != 0);
          FindClose(hFindFile);
        }
    }
    


  • kekekese
    wenn man die zeile

    printf("%s\n", result);
    

    nicht mit einfügt dann kratz immer die .exe bei mir ab??
    why?



  • Hmm ich will euch nicht kritisieren ... aber @kekekse ... dein Code ist seeehr unsicher ... wenn path bsw länger als MAX_PATH ist ... was passiert dann?



  • === DIESER CODE IST NUR ZU TESTZWECKEN ZU GEBRAUCHEN ===

    The FindFirstFile function searches a directory for a file whose name matches the specified filename. FindFirstFile examines subdirectory names as well as filenames.

    Parameters

    lpFileName

    Windows 95: Points to a null-terminated string that specifies a valid directory or path and filename, which can contain wildcard characters (* and ?). This string must not exceed MAX_PATH characters.

    Du hast recht, ich habe mich bisher immer auf Windows und die Konstante MAX_PATH=260 verlassen. Ich werde wohl demnächst neue Variante coden müssen.

    Auf die Schnelle:

    char result[MAX_PATH+MAX_PATH+10];
    
    snprintf(mask, sizeof(mask), "%.250s\\*.*", path);
    snprintf(result, sizeof(result), "%.250s\\%s", path, wfd.cFileName);
    

    oder

    sprintf(mask, "%.250s\\*.*", path);
    


  • Dry Gin schrieb:

    kekekese
    wenn man die zeile

    printf("%s\n", result);
    

    nicht mit einfügt dann kratz immer die .exe bei mir ab??
    why?

    Das kann nicht sein, glaub ich nicht



  • 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);
        }
    }
    

Anmelden zum Antworten