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 jaFindFirstFile 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 stehtif(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).