[vc6] CFtpConnetion::GetFile(...)
-
Hallo zusammen!
void ftpCollector::doStuff ( const std::string a_outputfolder, const std::string a_archivefolder, const std::string a_extension ) { try { CFtpFileFind finder ( m_pFTPSession ); // iterating over folder std::string extension ( "*."+a_extension ); BOOL repeat = finder.FindFile ( extension.c_str() ); while ( repeat ) { // finding first "*.a_extension" repeat = finder.FindNextFile (); std::string url ( finder.GetFileURL ( ) ); std::string name ( finder.GetFileName ( ) ); std::string output ( a_outputfolder + "\\" + name ); Logger::LogString ( m_strLogName, ("[fnd] " + url), false ); // copy to output if ( m_pFTPSession->GetFile ( url.c_str(), output.c_str(), FALSE, FILE_ATTRIBUTE_NORMAL, m_bASCII ? FTP_TRANSFER_TYPE_ASCII : FTP_TRANSFER_TYPE_BINARY ) ) { Logger::LogString ( m_strLogName, ( "\t[cpy] " + output ), false ); } else { char pcError[512]; DWORD d1, d2; BOOL b = InternetGetLastResponseInfo(&d1, pcError, &d2); std::string error ( pcError ); Logger::LogString ( m_strLogName, error, false ); } std::string archive ( a_archivefolder + "\\" + name ); // copy to archive if ( m_pFTPSession->GetFile ( url.c_str(), archive.c_str(), FALSE, FILE_ATTRIBUTE_NORMAL, m_bASCII ? FTP_TRANSFER_TYPE_ASCII : FTP_TRANSFER_TYPE_BINARY ) ) { Logger::LogString ( m_strLogName, archive, false ); } else { char pcError[512]; DWORD d1, d2; BOOL b = InternetGetLastResponseInfo(&d1, pcError, &d2); std::string error ( pcError ); Logger::LogString ( m_strLogName, error, false ); } // deleting if ( m_pFTPSession->Remove ( url.c_str() ) ) { Logger::LogString ( m_strLogName, ( "\t[del] " + url ), false ); } else { char pcError[512]; DWORD d1, d2; BOOL b = InternetGetLastResponseInfo(&d1, pcError, &d2); std::string error ( pcError ); Logger::LogString ( m_strLogName, error, false ); } } // forget the following 'Close()' and you'll be hit by an access violation finder.Close(); } catch ( CInternetException* excp ) { // error during ftp transfer TCHAR sz[1024]; excp->GetErrorMessage ( sz, 1024 ); excp->Delete (); std::string msg ( sz ); throw ( msg ); } catch ( ... ) { // error during anything throw ( "error while ftp file i/o" ); } }
Mit obigem Fragment (ftp Initialisierung funktioniert ohne Probleme, gilt als Vorraussetzung) versuche ich mehrere Dateien mit bestimmten Erweiterungen 'a_extension' in das Verzeichnis 'a_outputfolder' und 'a_archivefolder' zu kopieren und anschließend zu löschen. Das ganze klappt ohne Probleme mit einem lokal und entfernt installierten FTP-Server (personal ftp). Bei einer Pure-FTPd Installation auf einer Linux Maschine verliert sich das ganze beim 'GetFile(...)' Aufruf in:
200 TYPE is now ASCII 200 PORT command successful 550 Can't check for file existence 550 Can't open ftp://10.0.0.5/test_ens_03.xml: No such file or directory
Problematisch: mit sämtlichen FTP-Clients, sogar der MS Eingabeaufforderung, klappt alles ohne zu zicken. Daher meine Vermutung: irgendetwas hab ich vergessen oder mach ich falsch.
-mh
PS: die FTP-Server sind so konfiguriert das jeder Benutzer sein eigenes Verzeichnis besitzt.