📄 remotefile.cpp
字号:
#include "stdafx.h";
#include "cedtHeader.h"
#include "FtpClnt.h"
#include <afxinet.h>
#include "RemoteFile.h"
static BOOL CheckIfWinSockInitialized();
static BOOL CleanRemoteFileListItem(CString & szItem);
static BOOL ParseRemoteFileListItem(CString & szMode, DWORD & dwSize, CString & szTime, CString & szLeft, LPCTSTR lpszItem);
BOOL DownloadRemoteFile(CFtpAccount & rFtpAccount, LPCTSTR lpszRemoteFile, LPCTSTR lpszLocalFile, CALLBACK_FUNCTION fcnCallback)
{
if( rFtpAccount.m_bUseWinInet ) {
return DownloadRemoteFileWinInet(rFtpAccount, lpszRemoteFile, lpszLocalFile, fcnCallback);
} else {
return DownloadRemoteFileFtpClnt(rFtpAccount, lpszRemoteFile, lpszLocalFile, fcnCallback);
}
}
BOOL DownloadRemoteFileWinInet(CFtpAccount & rFtpAccount, LPCTSTR lpszRemoteFile, LPCTSTR lpszLocalFile, CALLBACK_FUNCTION fcnCallback)
{
if( ! rFtpAccount.IsValid() ) return FALSE;
CInternetSession clsInternetSession;
CFtpConnection * pFtpConnection = NULL;
try {
pFtpConnection = clsInternetSession.GetFtpConnection(
rFtpAccount.m_szServerName, rFtpAccount.m_szUserName, rFtpAccount.m_szPassword,
rFtpAccount.m_nPortNumber, rFtpAccount.m_bPassiveMode );
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
ex->Delete(); return FALSE;
}
// BOOL bResult = pFtpConnection->GetFile(lpszRemoteFile, lpszLocalFile, FALSE);
CInternetFile * pInternetFile = NULL;
CFile localFile; TCHAR szBuffer[FTP_TRANSFER_BUFFER_SIZE];
BOOL bTransferCompleted = FALSE;
try {
pInternetFile = pFtpConnection->OpenFile(lpszRemoteFile, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY);
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
pFtpConnection->Close(); delete pFtpConnection;
ex->Delete(); return FALSE;
}
if( ! localFile.Open(lpszLocalFile, CFile::modeReadWrite | CFile::modeCreate) ) {
pInternetFile->Close(); delete pInternetFile;
pFtpConnection->Close(); delete pFtpConnection;
return FALSE;
}
BOOL bContinue = TRUE; UINT nRead, nTotalRead = 0;
while( bContinue ) {
try {
nRead = pInternetFile->Read(szBuffer, FTP_TRANSFER_BUFFER_SIZE);
if( nRead ) { localFile.Write(szBuffer, nRead); nTotalRead += nRead; }
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
localFile.Close(); // close local file
pInternetFile->Close(); delete pInternetFile;
pFtpConnection->Close(); delete pFtpConnection;
ex->Delete(); return FALSE;
}
if( fcnCallback ) bContinue = fcnCallback(nTotalRead);
if( ! bContinue || nRead < FTP_TRANSFER_BUFFER_SIZE ) break;
}
bTransferCompleted = bContinue;
localFile.Close(); // close local file
pInternetFile->Close(); delete pInternetFile;
pFtpConnection->Close(); delete pFtpConnection;
return bTransferCompleted;
}
BOOL DownloadRemoteFileFtpClnt(CFtpAccount & rFtpAccount, LPCTSTR lpszRemoteFile, LPCTSTR lpszLocalFile, CALLBACK_FUNCTION fcnCallback)
{
if( ! rFtpAccount.IsValid() || ! CheckIfWinSockInitialized() ) return FALSE;
CFtpClient client;
if( ! client.Open(rFtpAccount.m_szServerName, rFtpAccount.m_nPortNumber) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_CONNECT, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
return FALSE;
}
if( ! client.LogOn(rFtpAccount.m_szUserName, rFtpAccount.m_szPassword) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_LOGON, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
client.Close(); return FALSE;
}
CFile localFile; TCHAR szBuffer[FTP_TRANSFER_BUFFER_SIZE];
BOOL bTransferCompleted = FALSE;
if( ! client.OpenFile(TRUE, lpszRemoteFile, TRUE /* BINARY MODE */, rFtpAccount.m_bPassiveMode) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_OPEN, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
client.LogOff(); client.Close(); return FALSE;
}
if( ! localFile.Open(lpszLocalFile, CFile::modeReadWrite | CFile::modeCreate) ) {
client.CloseFile(); client.LogOff(); client.Close(); return FALSE;
}
BOOL bContinue = TRUE; UINT nRead, nTotalRead = 0;
while( bContinue ) {
try {
nRead = client.ReadFile(szBuffer, FTP_TRANSFER_BUFFER_SIZE);
if( nRead ) { localFile.Write(szBuffer, nRead); nTotalRead += nRead; }
} catch( CException * ex ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_TRANSFER);
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
localFile.Close(); client.Close(); ex->Delete(); return FALSE;
}
if( fcnCallback ) bContinue = fcnCallback(nTotalRead);
if( ! bContinue || nRead < FTP_TRANSFER_BUFFER_SIZE ) break;
}
bTransferCompleted = bContinue;
localFile.Close(); // close local file
client.CloseFile(); client.LogOff(); client.Close();
return bTransferCompleted;
}
BOOL UploadLocalFile(CFtpAccount & rFtpAccount, LPCTSTR lpszLocalFile, LPCTSTR lpszRemoteFile, CALLBACK_FUNCTION fcnCallback)
{
if( rFtpAccount.m_bUseWinInet ) {
return UploadLocalFileWinInet(rFtpAccount, lpszLocalFile, lpszRemoteFile, fcnCallback);
} else {
return UploadLocalFileFtpClnt(rFtpAccount, lpszLocalFile, lpszRemoteFile, fcnCallback);
}
}
BOOL UploadLocalFileWinInet(CFtpAccount & rFtpAccount, LPCTSTR lpszLocalFile, LPCTSTR lpszRemoteFile, CALLBACK_FUNCTION fcnCallback)
{
if( ! rFtpAccount.IsValid() ) return FALSE;
CInternetSession clsInternetSession;
CFtpConnection * pFtpConnection = NULL;
try {
pFtpConnection = clsInternetSession.GetFtpConnection(
rFtpAccount.m_szServerName, rFtpAccount.m_szUserName, rFtpAccount.m_szPassword,
rFtpAccount.m_nPortNumber, rFtpAccount.m_bPassiveMode );
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
ex->Delete(); return FALSE;
}
// BOOL bResult = pFtpConnection->PutFile(lpszLocalFile, lpszRemoteFile);
CInternetFile * pInternetFile = NULL;
CFile localFile; TCHAR szBuffer[FTP_TRANSFER_BUFFER_SIZE];
BOOL bTransferCompleted = FALSE;
try {
pInternetFile = pFtpConnection->OpenFile(lpszRemoteFile, GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY);
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
pFtpConnection->Close(); delete pFtpConnection;
ex->Delete(); return FALSE;
}
if( ! localFile.Open(lpszLocalFile, CFile::modeRead ) ) {
pInternetFile->Close(); delete pInternetFile;
pFtpConnection->Close(); delete pFtpConnection;
return FALSE;
}
BOOL bContinue = TRUE; UINT nRead, nTotalRead = 0;
while( bContinue ) {
try {
nRead = localFile.Read(szBuffer, FTP_TRANSFER_BUFFER_SIZE);
if( nRead ) { pInternetFile->Write(szBuffer, nRead); nTotalRead += nRead; }
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
localFile.Close(); // close local file
pInternetFile->Close(); delete pInternetFile;
pFtpConnection->Close(); delete pFtpConnection;
ex->Delete(); return FALSE;
}
if( fcnCallback ) bContinue = fcnCallback(nTotalRead);
if( ! bContinue || nRead < FTP_TRANSFER_BUFFER_SIZE ) break;
}
bTransferCompleted = bContinue;
localFile.Close(); // close local file
pInternetFile->Close(); delete pInternetFile;
pFtpConnection->Close(); delete pFtpConnection;
return bTransferCompleted;
}
BOOL UploadLocalFileFtpClnt(CFtpAccount & rFtpAccount, LPCTSTR lpszLocalFile, LPCTSTR lpszRemoteFile, CALLBACK_FUNCTION fcnCallback)
{
if( ! rFtpAccount.IsValid() || ! CheckIfWinSockInitialized() ) return FALSE;
CFtpClient client;
if( ! client.Open(rFtpAccount.m_szServerName, rFtpAccount.m_nPortNumber) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_CONNECT, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
return FALSE;
}
if( ! client.LogOn(rFtpAccount.m_szUserName, rFtpAccount.m_szPassword) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_LOGON, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
client.Close(); return FALSE;
}
CFile localFile; TCHAR szBuffer[FTP_TRANSFER_BUFFER_SIZE];
BOOL bTransferCompleted = FALSE;
if( ! client.OpenFile(FALSE, lpszRemoteFile, TRUE /* BINARY MODE */, rFtpAccount.m_bPassiveMode) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_OPEN, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
client.LogOff(); client.Close(); return FALSE;
}
if( ! localFile.Open(lpszLocalFile, CFile::modeRead ) ) {
client.CloseFile(); client.LogOff(); client.Close(); return FALSE;
}
BOOL bContinue = TRUE; UINT nRead, nTotalRead = 0;
while( bContinue ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -