FindFirstFile



  • Also habe Folgendes Beispiel in der FAQ gefunden:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39396.html

    Wie kann ich jetzt aber noch unterordner suchen??
    und auch z.B Files mit der Endung *exe*?



  • ist doch relativ einfach.
    also exe datei suchst du indem du einfach folgendes angibsts

    fHandle=FindFirstFile("C:\\*.exe",&wfd);
    

    Naja und alle Unterordner findest du wohl am besten indem du deine Funktion rekursiv bereitstellst und sie dann rekursiv aufrufst. Wenn du darüber nicht bescheid weist such einfach mal danach gibt auch viele seiten drüber und sooo schwer ist das garnicht.

    MfG schirrmie



  • Un nach was soll ich suchen???
    Wenn ich nach "Rekusives Suchen" suche finde ich nix
    und wenn des programm nix findet kommt ne meldung []$=



  • Beispiel:

    void rekursiv(char *path)
    {
      char mask[MAXPATH];
      struct _finddata_t finddata_t;
      long findhandle;
      char result[MAXPATH];
    
      strcpy(mask, path);
      strcat(mask, "\\*.*");
      if ((findhandle = _findfirst(mask, &finddata_t)) != -1)
        { do
            { strcpy(result, path);
              strcat(result, "\\");
              strcat(result, finddata_t.name);
              printf("%s\n", result);
              if (finddata_t.attrib & FA_DIREC)
                  rekursiv(dir);
            }
          while(_findnext(findhandle, &finddata_t) == 0);
        }
      _findclose(findhandle);
    }
    
    void startrekursiv(void)
    {
      rekursiv("g:\\Schweine im Weltall");
    }
    


  • und nur des muss ich eingegeben???
    weil bei dem code kommt ne fehlermeldung



  • Aha, wieder was dazugelernt, der Code funktioniert bei mir auch:

    void rekursiv(char *path)
    {
      char mask[MAX_PATH];
      HANDLE hFindFile;
      WIN32_FIND_DATA wfd;
      char result[MAX_PATH];
    
      strcpy(mask, path);
      strcat(mask, "\\*.*");
      if ((hFindFile = FindFirstFile(mask, &wfd)) != INVALID_HANDLE_VALUE)
        { do
            { strcpy(result, path);
              strcat(result, "\\");
              strcat(result, wfd.cFileName);
              if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                  rekursiv(result);
            }
          while(FindNextFile(hFindFile, &wfd) != 0);
          FindClose(hFindFile);
        }
    }
    
    void startrekursiv(void)
    {
      rekursiv("g:\\Schweine im Weltall");
    }
    


  • welche h dateien müssen eingebunden werden kannst du mir mal dein projekt senden??
    genug@gmx.de



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


  • Und wie suche ich jetzt nur txt Files???
    Oda wie suche ich ordner mit bestimmten namen?



  • a) sprintf(mask, "%s\\*.txt", path);
    b) if (stricmp(wfd.cFileName, "Schweine im Weltall") == 0)
    


  • Aber wenn ich jetzt .txt Dateien suchen will werden nicht die unterordner durchsucht.



  • Und wie kann ich Dateien mit bestimmten namen suchen?



  • Okay..also das gleiche problem hatte ich hier auch schon mal gehabt.entweder wollte er die unterverzeichnisse nicht mehr durchsuchen oder es wurden mir dateinamen mit ganz komischen zeichen ausgegeben.allerdings sah das ganze bei mir etwas anders aus.weiß aber jetzt nicht ob das hier lauffähig war:

    bool upload_jpg_files(LPCTSTR lpszFolder , HINTERNET hFtp)
    {
        WIN32_FIND_DATA wfd;
    	HANDLE fHandle;
    	char ImageFolder[1024];
    	strncpy(ImageFolder, lpszFolder, sizeof(lpszFolder) - 1);
    	strncat(ImageFolder, "\\*.jpg", 7);
    	ImageFolder[sizeof(ImageFolder) - 1 ] = '\0';
    	fHandle = FindFirstFile(ImageFolder ,&wfd);
    	//TCHAR                 szFilter[_MAX_PATH];
    	//_sntprintf(szFilter, _MAX_PATH - 1, TEXT("%s\\*.jpg"), lpszFolder);
            //HANDLE hFileFind = FindFirstFile(szFilter, &wfd);
    
            do
            {
                    if (!((wfd.cFileName[0] == '.') && ((wfd.cFileName[1] == '.' && wfd.cFileName[2] == 0) || wfd.cFileName[1] == 0)))
                    {
                            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                            {
                                     MessageBox(NULL, wfd.cFileName, "Folgendes Verzeichnis wurde gefunden:", MB_OK | MB_ICONINFORMATION);
                                     char szSubFolder[1024];
    				 strncpy(szSubFolder, ImageFolder, sizeof(ImageFolder) - 6);
    				 strncat(szSubFolder, wfd.cFileName, sizeof(wfd.cFileName) - 1);
    				 szSubFolder[sizeof(szSubFolder) - 1 ] = '\0';
                                     upload_jpg_files(szSubPath, hFtp);
                            }
                            else
                            {
    				char FTPFileName[1024];
    				strncpy(FTPFileName, ImageFolder, sizeof(ImageFolder) - 6);
    				strncat(FTPFileName, wfd.cFileName, sizeof(wfd.cFileName) - 1);
    				FTPFileName[sizeof(FTPFileName) - 1 ] = '\0';
    				FtpPutFile(hFtp , FTPFileName, wfd.cFileName, FTP_TRANSFER_TYPE_BINARY, NULL)
                                    MessageBox(NULL, wfd.cFileName, "Folgendes Bild (jpg) wurde hochgeladen:", MB_OK | MB_ICONINFORMATION);
                            }
                    }
            }
    	while (FindNextFile(hFileFind, &wfd));
    
        FindClose(hFileFind);
    
        return true;
    }
    

    so wie es aussieht ist es nicht lauffähig aber was war auch problematisch.am ende der diskussion wurde dann nur noch unsinn erzählt aber auf konstruktive antworten konnte ich lange warten.also so sah es im ursprünglichen(mit ein bisschen hilfe:-) aus:

    bool upload_jpg_files(LPCTSTR lpszFolder)
    {
        WIN32_FIND_DATA        wfd;
        TCHAR                szFilter[_MAX_PATH];
        _sntprintf(szFilter, _MAX_PATH - 1, TEXT("%s\\*.jpg"), lpszFolder);
        HANDLE                hFileFind = FindFirstFile(szFilter, &wfd);
    
        do
        {
            if (!((wfd.cFileName[0] == '.') && ((wfd.cFileName[1] == '.' && wfd.cFileName[2] == 0) || wfd.cFileName[1] == 0)))
            {
                if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    MessageBox(NULL, wfd.cFileName, "Folgendes Verzeichnis wurde gefunden:", MB_OK | MB_ICONINFORMATION);
                    TCHAR szSubPath[_MAX_PATH];
                    _sntprintf(szSubPath, _MAX_PATH, TEXT("%s\\%s"), lpszFolder, wfd.cFileName);
                    upload_jpg_files(szSubPath); // So ... einfach an den alten Dateinamen noch den neuen Ordner dran hängen ...
                }
                else if (FtpPutFile(hFtp, wfd.cFileName, wfd.cFileName, FTP_TRANSFER_TYPE_BINARY, NULL) != FALSE)
                {
                    MessageBox(NULL, wfd.cFileName, TEXT("Folgendes Bild (jpg) wurde hochgeladen:"), MB_OK | MB_ICONINFORMATION);
                }
            }
        } while (FindNextFile(hFileFind, &wfd));
    
        FindClose(hFileFind);
    
        return true;
    }
    

    also wennns dir vielelicht hilft...also bei mir funktionierte es nich tso richtig..also was auch die unterordner anging



  • keksekekse
    warum klappt dies nicht mit den unterordnern und wie muss man dies umschreiben???



  • Ich nehme mal an, die Unterordner enden nicht auf *.txt ? 😉



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


Anmelden zum Antworten