FTP Verbindung und FtpFindFirstFile / InternetFindNextFile Problem



  • Guten Abend 🙂

    ich möchte gerne in verbindung mit

    FtpFindFirstFile / InternetFindNextFile
    

    und der Funktion

    FtpGetFile
    

    Datei aus nur einem Ordner "downloaden" (ohne Unterordner, also nicht rekursiv).

    Der Ordner besteht nur aus 3 x .txt Datein:

    a.txt
    b.txt
    c.txt
    

    Hier mein Code:

    HINTERNET hInetOpen, hInetConnect;
    			WIN32_FIND_DATAA ftpdata;
    			HANDLE ftpfind;
    
    			char user[50] = "nikolaus";
    			char pass[50] = "ostern";
    			char host1[50] = "ftpHansPeter";
    
    			string ftp_connection;
    			stringstream ftp_connection_stream;
    			ftp_connection_stream << host1;
    			ftp_connection = ftp_connection_stream.str();
    
    			const char * ftp = ftp_connection.c_str();
    
    			hInetOpen = InternetOpen("FTP", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    			hInetConnect = InternetConnect(hInetOpen, ftp, INTERNET_DEFAULT_FTP_PORT, user, pass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    
    		if ((hInetOpen || hInetConnect) == TRUE)
    			{
    				MessageBox(0, " CONNECTED", "FTP ONLINE", MB_OK); 
    
    				ftpfind = FtpFindFirstFile(
    					hInetConnect,
    					"/FTP/BS/",
    					&ftpdata,
    					INTERNET_FLAG_NO_CACHE_WRITE,
    					NULL);
    
    				(InternetFindNextFile( ftpfind, &ftpdata ) != 0);
    
    				do  
    
    				 {
    					stringstream ftp_server;
    					ftp_server << "/FTP/BS/" << ftpdata.cFileName;
    					string ftp_server_s = ftp_server.str();
    
    					const char*ftp_server_const = ftp_server_s.c_str();
    
    					stringstream ftp_local;
    					ftp_local << "UPDATE/" << ftpdata.cFileName;
    					string ftp_local_s = ftp_local.str();
    
    					const char*ftp_local_const = ftp_local_s.c_str();
    
    					stringstream ftplist;
    					ftplist << ftpdata.cFileName;
    
    					string check = ftplist.str();
    
    					const char*was = check.c_str();
    
    					FtpGetFile(
    						hInetConnect,
    						ftp_server_const,
    						ftp_local_const,
    						TRUE,
    						FILE_ATTRIBUTE_NORMAL,
    						FTP_TRANSFER_TYPE_UNKNOWN, 0);
    
    				} while (InternetFindNextFile(ftpfind, &ftpdata) != 0);
    				 FindClose(ftpfind);
    

    Das Ergebnis is jedoch:

    b.txt
    c.txt
    

    Ich habe schon verschiedene Ansätze probiert und es war auch alles sehr lehrreich jedoch bekam ich dieses Problem nicht vollständig gelöst. 😕

    Kann mir da einer ein Denkanstoß in die richtige Richtung verpassen : P ?



  • Was soll denn Zeile 34?
    Der generelle Aufbau ist ja

    FindFirstFile
    do
    {...} while(FindNextFile
    

    Bei dir ist es jedoch

    FindFirstFile
    FindNextFile
    do
    {...} while(FindNextFile
    


  • Unglaublich 😮 😮

    Natürlcih war das der Fehler 👍

    Ich saß da jetzt mehr als ne Woche dran...ich verbuch das mal als Anfängerfehler.

    Komisch, ich habe das sogar genau so:

    FindFirstFile
    FindNextFile
    do
    {...} while(FindNextFile
    

    Local in an einer anderen stelle verwendet und ich bekam noch kein negatives Feedback dazu.

    Noch eine letzte Verständnisfrage:

    Das -> != 0

    in

    (InternetFindNextFile( ftpfind, &ftpdata ) != 0);
    

    Was hat das genau zu bedeuten ? 😕



  • Es wird doch nur der Returnwert der Funktion geprüft, im ersten Fall (Zeile 34) ist es natürlich falsch, bei FtpFindFirstFile fehlt die Überprüfung:

    ftpfind = FtpFindFirstFile(
                        hInetConnect,
                        "/FTP/BS/",
                        &ftpdata,
                        INTERNET_FLAG_NO_CACHE_WRITE,
                        NULL);
      if(ftpfind==INVALID_HANDLE_VALUE)
      // Fehler melden, return
    

    Das hier:

    if ((hInetOpen || hInetConnect) == TRUE)
    

    Es sollte jeweils auf !=0 und nicht auf ==1 geprüft werden.
    Oben steht

    if(Wert1!=0 || Wert2!=0) == 1)
    

    und ist schlicht falsch, auch wenn einer der Werte 0 ist, ist die Bedingung erfüllt.
    Richtig:

    if(hInetOpen && hInetConnect)
    

    stringstreams sind im Folgenden auch überflüssig, nimm gleich std::string-Operationen.
    FindClose muss im Fehlerfall trotzdem aufgerufen werden, besser einen Wrapper bauen (RAII).


Anmelden zum Antworten