[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.


Anmelden zum Antworten