FindFirstFile



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



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


Anmelden zum Antworten