FindFirstFile



  • ja aber wie soll man es den dan machen?



  • FindFirstFile mit "c:\\ErsterOrdner\*".
    Mit "if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ..." prüfen ob es sich um Ordner oder Datei handelt. Wenn es nen Ordner ist: Dasselbe nochmal für den Unterordner starten, wenn es ne Datei ist: Endung rausfischen 😉

    Der Filter von FindFirstFile() wird soviel ich weiß auch auf Unterordner angewandt...



  • Hey dry gin,
    wenn dein code läuft könntest du ihn nochmal posten???wäre ganz nett:-)



  • ja des ist der code den kekese gepostet hat.
    kekese des mit der ordner suche klappt auch net



  • Den Link mal zu Gemüte führen: http://msdn2.microsoft.com/en-us/library/aa364418.aspx

    Und etwas rumprobieren:

    "c:\\path\*.*" liefert per Struktur wfd alle Dateien (und Unterverzeichnisnamen)
    "c:\\path\*.txt" liefert per Struktur wfd nur *.txt-Dateinamen und *.txt-Unterverzeichnisnamen.

    Ein Unterverzeichniseintrag unterscheidet sich ausschließlich im gesetzten FILE_ATTRIBUTE_DIRECTORY-Flag (wfd.dwFileAttributes) von den anderen Einträgen.

    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
    
    int main()
    {
      HANDLE hFindFile;
      WIN32_FIND_DATA wfd;
    
      if ((hFindFile = FindFirstFile("c:\\*.*", &wfd)) != INVALID_HANDLE_VALUE)
          FindClose(hFindFile);
      printf("wfd.dwFileAttributes 0x%08X\n", wfd.dwFileAttributes);
      printf("wfd.cFileName %s\n", wfd.cFileName);
      getch();
      return 0;  
    }
    

    In der Header-Datei winnt.h sind die Flagwerte aus den Zeiten von MS-DOS definiert:

    #define FILE_ATTRIBUTE_READONLY             0x00000001 
    #define FILE_ATTRIBUTE_HIDDEN               0x00000002
    #define FILE_ATTRIBUTE_SYSTEM               0x00000004
    #define FILE_ATTRIBUTE_DIRECTORY            0x00000010
    #define FILE_ATTRIBUTE_ARCHIVE              0x00000020
    

    Und hier die Struktur wfd aus winbase.h:

    typedef struct _WIN32_FIND_DATAA {
        DWORD dwFileAttributes;
        FILETIME ftCreationTime;
        FILETIME ftLastAccessTime;
        FILETIME ftLastWriteTime;
        DWORD nFileSizeHigh;
        DWORD nFileSizeLow;
        DWORD dwReserved0;
        DWORD dwReserved1;
        CHAR   cFileName[ MAX_PATH ];
        CHAR   cAlternateFileName[ 14 ];
    } WIN32_FIND_DATAA;
    

    Kann man noch mehr Information liefern...



  • 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


Anmelden zum Antworten