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