使用MFC類CInternetSession和CFtpConnection構建FTP客戶端

#pragma once

#include <afxinet.h>
#include <vector>

#define FTP_DEFAULT_PORT 21

struct FileProperty
{
	CString strFileName;
	// FILE_ATTRIBUTE_DIRECTORY 
	// GetFileAttributes
	DWORD dwFileType;
};

class CYWFtpSession
{
public:
	CYWFtpSession(void);
	~CYWFtpSession(void);

	// 設置FTP服務器地址、端口
	void SetServerParam(CString strServerAddr, INTERNET_PORT wServerPort);
	// 設置登錄名和密碼
	void SetUserInfo(CString strUserName, CString strPassWord, BOOL bInitiativeMode = FALSE);
	// 連接到指定FTP服務器
	BOOL ConnectToServer();
	// 得到指定目錄下的所有文件
	void GetFileList(CString strDirPath, std::vector<FileProperty> &vctFileList);
	// 上傳一個文件到FTP服務器
	BOOL PutFileToServer(CString strLocalFile, CString strPutPath);
	// 從FTP服務器下載一個文件
	BOOL GetFileFromServer(CString strRemoteFile, CString strLocalPath, BOOL bFailIfExists = FALSE);
	// 關閉連接
	void CloseConnection();

	// 檢測對象是否存在
	BOOL IsConnectionActive();

	// 獲取最後一個錯誤信息
	CString GetLastErrorMessage();

private:
	// FTP服務器地址
	CString m_strServerAddr;
	// 服務端口
	INTERNET_PORT m_wServerPort;
	// 登錄用戶名
	CString m_strUserName;
	// 登錄密碼
	CString m_strPassWord;
	// 被動模式-FALSE  主動模式-TRUE
	BOOL m_bInitiativeMode;
	// 記錄最後一個錯誤信息
	CString m_strLastErrorMsg;

	// 創建並初始化一個或多個同時的Internet 會話
	CInternetSession m_cInetSession;
	// 管理與Internet服務器的FTP連接並允許直接操縱服務器中的目錄和文件
	CFtpConnection *m_pFtpConn;
};

#include "StdAfx.h"
#include "YWFtpSession.h"

CYWFtpSession::CYWFtpSession(void)
{
	m_pFtpConn = NULL;
	m_strServerAddr.Empty();
	m_wServerPort = FTP_DEFAULT_PORT;
	m_strUserName.Empty();
	m_strPassWord.Empty();
	m_bInitiativeMode = FALSE;
	m_strLastErrorMsg.Empty();
}

CYWFtpSession::~CYWFtpSession(void)
{
	CloseConnection();
}

// 設置FTP服務器地址、端口
void CYWFtpSession::SetServerParam(CString strServerAddr, INTERNET_PORT wServerPort)
{
	m_strServerAddr = strServerAddr;
	m_wServerPort = wServerPort;
}

// 設置登錄名和密碼
void CYWFtpSession::SetUserInfo(CString strUserName, CString strPassWord, BOOL bInitiativeMode)
{
	m_strUserName = strUserName;
	m_strPassWord = strPassWord;
	m_bInitiativeMode = bInitiativeMode;
}

// 連接到指定FTP服務器
BOOL CYWFtpSession::ConnectToServer()
{
	try
	{
		CloseConnection();
		// m_bInitiativeMode = TRUE 爲被動模式
		m_pFtpConn = m_cInetSession.GetFtpConnection(m_strServerAddr, 
			m_strUserName, m_strPassWord, m_wServerPort, m_bInitiativeMode);
		if (NULL != m_pFtpConn)
			return TRUE;
	}
	catch (CInternetException *e)
	{
		e->Delete();
	}
	return FALSE;
}

// 得到指定目錄下的所有文件
void CYWFtpSession::GetFileList(CString strDirPath, std::vector<FileProperty> &vctFileList)
{
	if (NULL == m_pFtpConn
		&& !ConnectToServer())
		return ;

	vctFileList.empty();

	CFtpFileFind cFtpFileFind(m_pFtpConn);
	// 查找指定目錄
	BOOL bWorking = cFtpFileFind.FindFile(strDirPath);
	while (bWorking)
	{
		bWorking = cFtpFileFind.FindNextFile();
		// .或者..
		if (cFtpFileFind.IsDots())
			continue;
		FileProperty sOneFile;
		// 得到文件名
		sOneFile.strFileName = cFtpFileFind.GetFileName();
		sOneFile.dwFileType = 0;
		// 文件夾
		if (cFtpFileFind.IsDirectory())
			sOneFile.dwFileType |= FILE_ATTRIBUTE_DIRECTORY;
		else
			sOneFile.dwFileType |= FILE_ATTRIBUTE_NORMAL;	// 普通文件
		// 添加進文件列表
		vctFileList.push_back(sOneFile);
	}
}

// 上傳一個文件到FTP服務器
BOOL CYWFtpSession::PutFileToServer(CString strLocalFile, CString strPutPath)
{
	if (NULL == m_pFtpConn
		&& !ConnectToServer())
		return FALSE;

	return m_pFtpConn->PutFile(strLocalFile, strPutPath);
}

// 從FTP服務器下載一個文件
BOOL CYWFtpSession::GetFileFromServer(CString strRemoteFile, CString strLocalPath, BOOL bFailIfExists)
{
	if (NULL == m_pFtpConn
		&& !ConnectToServer())
		return FALSE;

	return m_pFtpConn->GetFile(strRemoteFile, strLocalPath, bFailIfExists);
}

// 關閉連接
void CYWFtpSession::CloseConnection()
{
	if (NULL != m_pFtpConn)
	{
		m_pFtpConn->Close();
		delete m_pFtpConn;
	}
	m_pFtpConn = NULL;
}

// 檢測對象是否存在
BOOL CYWFtpSession::IsConnectionActive()
{
    if (NULL == m_pFtpConn)
		return FALSE;
	return TRUE;
}

// 獲取最後一個錯誤信息
CString CYWFtpSession::GetLastErrorMessage()
{
	m_strLastErrorMsg.Format(_T("錯誤碼:%ld"), ::GetLastError());
	return m_strLastErrorMsg;
}

測試服務器:FileZilla Server


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章