InternetNextFile problem



  • hallo,

    ich moechte mir dateien auf einem ftp sevrer anzeigen lassen, bisher habe ich folgendes getan:

    HINTERNET hFTPSession, hFind;
    WIN32_FIND_DATA finddata;
            .
            .
            .
    if((hFind = FtpFindFirstFile(hFTPSession, "lib", &finddata, 0, 0)) == NULL)
                {
                           printf("an error occured\n");
                           printf("%d", GetLastError());
                }
                else
                {
                    printf("everything okay\n");
    
                    do
                    {
                           printf("%s\n", finddata.cFileName);
                    }while(InternetFindNextFile(hFind, &finddata));
                }
    

    allerdings bekomme ich nur die erste datei in dem verzeichnis aufgelistet... sieht jemand den fehler?



  • Gib uns mal die Fehlermeldung von GetLastError().

    Greetz, Swordfish



  • leider gibt es keinen fehler, es wird lediglich die erste datei in dem verzeichnis ausgelesen und dann bricht das programm ab...



  • Moh schrieb:

    [...] und dann bricht das programm ab...

    Das ist keine Fehlerbeschreibung.

    ➡ Smart Questions

    Greetz, Swordfish



  • das programm wird korrekt beendet. (ich habe es 'bricht ab' genannt, da es nicht die funktion erfuellt die ich wuensche)

    'InternetFindNext' liefert 'FALSE' zurueck obwohl in dem verzeichnis noch weitere datein liegen und das kann ich mir nicht erklaeren...

    ich poste einfach mal den kompletten code, dann ist das problem auch besser erkenntlich, wenn man das programm ausfuehrt:

    #include <windows.h>
    #include <wininet.h>
    
    int main()
    {
        HINTERNET hInternetRoot, hFTPSession, hFind;
        WIN32_FIND_DATA finddata;
    
    ///////////////////////////////////////////////////////////////////////////////////////////////
       if((hInternetRoot = InternetOpen("my app", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,
                           INTERNET_FLAG_ASYNC)) == NULL)
       {
               printf("an error occured\n");
               printf("%d", GetLastError());
       }
       else
       {
               printf("InternetOpen: everything okay\n");
       }
    
        if((hFTPSession = InternetConnect(hInternetRoot, "", INTERNET_DEFAULT_FTP_PORT,
                        NULL, NULL, INTERNET_SERVICE_FTP, 0, 0)) == NULL)             
        {
                printf("an error occured\n");
                printf("%d", GetLastError());
        }
        else
        {
                printf("InternetConnect: everything okay\n");
    
                //#####################################################################//
    
                if((hFind = FtpFindFirstFile(hFTPSession, "lib", &finddata, 0, 0)) == NULL)
                {
                           printf("an error occured\n");
                           printf("%d", GetLastError());
                }
                else
                {
                    printf("FtpFindFirstFile: everything okay\n\n");
    
                    do
                    {
                           printf("%s\n", finddata.cFileName);
                    }while(InternetFindNextFile(hFind, &finddata));
                }
    
                //#####################################################################//
    
                InternetCloseHandle(hInternetRoot);
                InternetCloseHandle(hFTPSession);
                InternetCloseHandle(hFind);
        }            
    ///////////////////////////////////////////////////////////////////////////////////////////////
    
        printf("\n\npress a key");
        getchar();   
        return 0;
    }
    

    die 'libwininet.a (libwininet.lib)' bibliothek muss hinzugefuegt werden



  • Moh schrieb:

    leider gibt es keinen Fehler [...]

    Lügner! 😡

    Es gibt einen Fehler:

    "Überlappender E/A-Vorgang wird verarbeitet."

    Ich würd' InternetOpen mal ohne dem INTERNET_FLAG_ASYNC-Flag aufrufen und beim lpszSearchFile-Parameter von FindFirstFile eine Wildcard angeben:

    #pragma comment( lib, "wininet.lib" )
    
    #include <iostream>
    #include <string>
    
    #include <windows.h>
    #include <wininet.h>
    
    using namespace std;
    
    string get_errmsg( unsigned long error )
    {
        void *buffer;
        FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                       0,
                       error,
                       MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
                       reinterpret_cast< char* >( &buffer ),
                       0,
                       0
        );
    
        string errmsg = string( reinterpret_cast< char* >( buffer ) );
        LocalFree( buffer );
        return errmsg;
    }
    
    int main()
    {
        void *internet, *ftp, *find;
        WIN32_FIND_DATA find_data;
    
        if( !( internet = InternetOpen( "my app",
                                        INTERNET_OPEN_TYPE_DIRECT,
                                        0,
                                        0,
                                        0 )
        ) ) {
    
            cout << "error: " << get_errmsg( GetLastError( ) ) << endl;
            return EXIT_FAILURE;
        }
    
        if( !( ftp = InternetConnect( internet,
                                      "ftp.server.org",
                                      INTERNET_DEFAULT_FTP_PORT,
                                      "user",
                                      "password",
                                      INTERNET_SERVICE_FTP,
                                      0,
                                      0 )
        ) ) {
    
            cout << "error: " << get_errmsg( GetLastError( ) ) << endl;
            InternetCloseHandle( internet );
            return EXIT_FAILURE;
        }
    
        if( !( find = FtpFindFirstFile( ftp,
                                        "/*.*",
                                        &find_data,
                                        0,
                                        0 )
        ) ) {
    
            InternetCloseHandle( ftp );
            InternetCloseHandle( internet );
            cout << "error: " << get_errmsg( GetLastError( ) ) << endl;
            return EXIT_FAILURE;
        }
    
        do
            cout << find_data.cFileName << endl;
    
        while( InternetFindNextFile( find, &find_data) );
    
        cout << "error: " << get_errmsg( GetLastError( ) ) << endl;
    
        InternetCloseHandle( find);
        InternetCloseHandle( ftp );
        InternetCloseHandle( internet );
    }
    

    Greetz, Swordfish



  • danke, hab nun das INTERNET_FLAG_ASYNC flag ausgeschaltet... funktioniert einwandfrei


Anmelden zum Antworten