⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remotefile.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -