#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;
};
.cpp 文件
#include "StdAfx.h"
#include "CMyFTPInteraction.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;
}
用法示例
CYWFtpSession Ftp;
Ftp.SetServerParam(_T("222.241.151.189"),FTP_DEFAULT_PORT);
Ftp.SetUserInfo(_T("賬號"),_T("密碼"));
if (!Ftp.PutFileToServer(_T("本地文件地址"),_T("/other/1.apk"))) // 後面的是服務器地址後面要添加上傳之後的文件名
{
AfxMessageBox(Ftp.GetLastErrorMessage());
}
Ftp.CloseConnection()