FindFirstFile



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



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


Anmelden zum Antworten