被老师逼疯的一次实验,全靠自学,实验就一次举手机会,对了过(期末占20分呢),学会了感觉还不错呢哈哈(在做的过程中也遇到过一些问题,但都解决了)
需要应用:IIS(FTP网站制作)、visual stadio 2019
第一步:打开Visual stadio,新建项目(c++,MFC应用)->基于对话框
(点击视图->其他窗口->资源视图,在资源视图中选择Dialog,可以到添加控件界面)
第三步:点击视图->工具箱。选择相应的控件,通过右击的属性来改变ID和文字
第四步:右击按钮控件->系统变量------添加变量(Connect、Update、Download、Quit)
添加完变量之后添加按钮类向导->添加处理程序(使每个按钮的ID与BN_CLICKED对应)
第五步:添加OnConnect、OnUpdate、OnDownload、OnDelete四个方法,类型为void
第六步:
在framework.c文件中添加
#include <afxinet.h>
#include <afxsock.h>
在XXXDlg.cpp中添加
CInternetSession* m_pInetSession;//MFC提供的会话类实例
CFtpConnection* m_pFtpConnection;//MFC提供的FTP连接类实例
CFtpFileFind* m_pRemoteFile;//MFC提供的远程文件搜索类实例
第七步:在OnClickedConnect()中添加连接FTP的代码,在OnConnect、OnUpdate、OnDownload、OnQuit、UpdateList五个方法中添加相应的代码来实现每个按钮操作。
void CMFCApplication5Dlg::OnClickedConnect()
{
// TODO: 在此添加控件通知处理程序代码
CString Address;//声明变量
GetDlgItemText(ID_EDIT, Address);//获得输入框所输入的地址 赋值给Address
OnConnect( Address);//把IP地址赋值调用OnConnect函数
this->UpdateList();//更新listbox列表
}
void CMFCApplication5Dlg::OnClickedDownload()
{
// TODO: 在此添加控件通知处理程序代码
this->OnDownload();
this->UpdateList();
}
void CMFCApplication5Dlg::OnClickedQuit()
{
// TODO: 在此添加控件通知处理程序代码
this->OnQuit();
this->UpdateList();
}
void CMFCApplication5Dlg::OnClickedUpdate()
{
// TODO: 在此添加控件通知处理程序代码
this->OnUpdate();
this->UpdateList();
}
void CMFCApplication5Dlg::OnConnect(CString m_IPaddress)
{
// TODO: 在此处添加实现代码.
S = new CInternetSession(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS);
//连接到一个FTP服务器,创建并返回指向CFTPConnection对象的指针
C = S->GetFtpConnection(m_IPaddress);
//用于客户端来查找特定文件
R = new CFtpFileFind(C);
}
void CMFCApplication5Dlg::OnDownload()
{
// TODO: 在此处添加实现代码.
CString selfile;
ListBox.GetText(ListBox.GetCurSel(), selfile);//获得想要下载资源名
if (!selfile.IsEmpty())//找到的资源名不为空
{
//弹出另存为对话框
CFileDialog file(FALSE, NULL, selfile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"所有文件(*.*)|*.*|", this);
if (file.DoModal() == IDOK)
{
CString strname;
strname = file.GetFileName();
CString strdir;
C->GetCurrentDirectory(strdir);
C->GetFile(selfile, strname);//下载文件到的本地位置
S->Close();
this->OnClickedConnect();
C->SetCurrentDirectory(strdir);
this->UpdateList();
AfxMessageBox(_T("下载成功!"));
}
}
}
void CMFCApplication5Dlg::OnUpdate()
{
// TODO: 在此处添加实现代码.
CString str;
CString strname;
//弹出“打开”对话框
CFileDialog file(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"所有文件(*.*)|*.*|", this);
if (file.DoModal() == IDOK)
{
str = file.GetPathName();
strname = file.GetFileName();
}
CString strdir;
C->GetCurrentDirectory(strdir);
//上传文件
BOOL bput = C->PutFile((LPCTSTR)str, (LPCTSTR)strname);
if (bput)
{
S->Close();//关闭会话
this->OnClickedConnect();//重新连接保持持续会话
C->SetCurrentDirectory(strdir);
this->UpdateList();//更新目录列表
AfxMessageBox(_T("上传成功!"));
}
}
void CMFCApplication5Dlg::OnQuit()
{
// TODO: 在此处添加实现代码.
UINT i;
i = MessageBox(TEXT("确认要退出程序吗?"), TEXT("温馨提示"), MB_YESNO | MB_ICONQUESTION);
if (i == IDNO)
{
return;
}
CDialogEx::OnOK();
}
void CMFCApplication5Dlg::UpdateList()
{
// TODO: 在此处添加实现代码.
ListBox.ResetContent();//自己声明的列表的变量名
//创建一个CFtpFileFind实例
CFtpFileFind ftpfind(C);//建立连接的实例
CString strdirpath;
C->GetCurrentDirectory(strdirpath);
//找到第一个文件或者文件夹
BOOL bfind = ftpfind.FindFile(strdirpath);
while (bfind)
{
bfind = ftpfind.FindNextFile();
CString strpath;
if (ftpfind.IsDots())
continue;
if (!ftpfind.IsDirectory()) //判断是目录还是文件
{
strpath = ftpfind.GetFileName(); //文件则读取文件名
ListBox.AddString(strpath);
}
else
{
strpath = ftpfind.GetFilePath();
ListBox.AddString(strpath);
}
}
}
最后添加FTP站点,将IP地址放入输入框中,可以实现所有功能。
核心源码都在上面了,自己做的话应该就不会需要下面的源码了。
版权声明:本文为qq_60203955原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。