TestDlg.cpp
上传用户:guibin827
上传日期:2021-12-07
资源大小:165k
文件大小:11k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // TestDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Test.h"
  5. #include "TestDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  10. class CAboutDlg : public CDialog
  11. {
  12. public:
  13. CAboutDlg();
  14. // 对话框数据
  15. enum { IDD = IDD_ABOUTBOX };
  16. protected:
  17. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  18. // 实现
  19. protected:
  20. DECLARE_MESSAGE_MAP()
  21. };
  22. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  23. {
  24. }
  25. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. }
  29. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  30. END_MESSAGE_MAP()
  31. // CTestDlg 对话框
  32. CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
  33. : CDialog(CTestDlg::IDD, pParent)
  34. {
  35. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  36. m_StrPassword = _T("");
  37. m_StrFTPServer = _T("");
  38. m_StrUserName = _T("");
  39. m_pIntSession = NULL;
  40. m_pFTPConnection = NULL;
  41. m_pRemoteFinder = NULL;
  42. m_StrLocalParentRoot = m_StrRemoteParentRoot = "";
  43. }
  44. void CTestDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialog::DoDataExchange(pDX);
  47. DDX_Control(pDX, IDC_LIST_REMOTE, m_ListRemoteFiles);
  48. DDX_Control(pDX, IDC_LIST_LOCAL, m_ListLocalFiles);
  49. DDX_Text(pDX, IDC_PASSWORD, m_StrPassword);
  50. DDX_Text(pDX, IDC_SERVER, m_StrFTPServer);
  51. DDX_Text(pDX, IDC_USER, m_StrUserName);
  52. }
  53. BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
  54. ON_WM_SYSCOMMAND()
  55. ON_WM_PAINT()
  56. ON_WM_QUERYDRAGICON()
  57. ON_BN_CLICKED(IDC_CONNECT, OnBtnConnectFTPServer)
  58. ON_BN_CLICKED(IDC_DOWNLOAD, OnBtnDownloadFile)
  59. ON_BN_CLICKED(IDC_LOCAL_UP, OnLocalParentFolder)
  60. ON_BN_CLICKED(IDC_LOCAL_DOWND, OnLocalChildFolder)
  61. ON_BN_CLICKED(IDC_REMOTE_UP, OnRemoteParentFolder)
  62. ON_BN_CLICKED(IDC_REMOTE_DOWND, OnRemoteChildFolder)
  63. ON_BN_CLICKED(IDC_UPLOAD, OnBtnUpLoadFile)
  64. //}}AFX_MSG_MAP
  65. END_MESSAGE_MAP()
  66. // CTestDlg 消息处理程序
  67. BOOL CTestDlg::OnInitDialog()
  68. {
  69. CDialog::OnInitDialog();
  70. // 将“关于...”菜单项添加到系统菜单中。
  71. // IDM_ABOUTBOX 必须在系统命令范围内。
  72. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  73. ASSERT(IDM_ABOUTBOX < 0xF000);
  74. CMenu* pSysMenu = GetSystemMenu(FALSE);
  75. if (pSysMenu != NULL)
  76. {
  77. CString strAboutMenu;
  78. strAboutMenu.LoadString(IDS_ABOUTBOX);
  79. if (!strAboutMenu.IsEmpty())
  80. {
  81. pSysMenu->AppendMenu(MF_SEPARATOR);
  82. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  83. }
  84. }
  85. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  86. //  执行此操作
  87. SetIcon(m_hIcon, TRUE); // 设置大图标
  88. SetIcon(m_hIcon, FALSE); // 设置小图标
  89. //初始化远程和本地两个列表框控件
  90. SetListCtrlStyle(&m_ListLocalFiles);
  91. SetListCtrlStyle(&m_ListRemoteFiles);
  92. AddHeaders(&m_ListLocalFiles);
  93. AddHeaders(&m_ListRemoteFiles);
  94. //本地文件夹以C盘为根目录
  95. BrowseFolder("c:",&m_ListLocalFiles,&m_LocalFinder,&m_ArrayLocalFiles);
  96. return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
  97. }
  98. void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
  99. {
  100. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  101. {
  102. CAboutDlg dlgAbout;
  103. dlgAbout.DoModal();
  104. }
  105. else
  106. {
  107. CDialog::OnSysCommand(nID, lParam);
  108. }
  109. }
  110. // 如果向对话框添加最小化按钮,则需要下面的代码
  111. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  112. //  这将由框架自动完成。
  113. void CTestDlg::OnPaint() 
  114. {
  115. if (IsIconic())
  116. {
  117. CPaintDC dc(this); // 用于绘制的设备上下文
  118. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  119. // 使图标在工作矩形中居中
  120. int cxIcon = GetSystemMetrics(SM_CXICON);
  121. int cyIcon = GetSystemMetrics(SM_CYICON);
  122. CRect rect;
  123. GetClientRect(&rect);
  124. int x = (rect.Width() - cxIcon + 1) / 2;
  125. int y = (rect.Height() - cyIcon + 1) / 2;
  126. // 绘制图标
  127. dc.DrawIcon(x, y, m_hIcon);
  128. }
  129. else
  130. {
  131. CDialog::OnPaint();
  132. }
  133. }
  134. //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  135. HCURSOR CTestDlg::OnQueryDragIcon()
  136. {
  137. return static_cast<HCURSOR>(m_hIcon);
  138. }
  139. //设置列表控件CListCtrl的风格
  140. void CTestDlg::SetListCtrlStyle(CListCtrl* pLstCtrl)
  141. {
  142. //获得原有风格
  143. DWORD dwStyle = GetWindowLong(pLstCtrl->m_hWnd, GWL_STYLE); 
  144. dwStyle &= ~(LVS_TYPEMASK);
  145. dwStyle &= ~(LVS_EDITLABELS);
  146. //设置新风格
  147.     SetWindowLong(pLstCtrl->m_hWnd, GWL_STYLE, dwStyle | LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
  148. //设置扩展风格
  149. DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;
  150. ListView_SetExtendedListViewStyleEx(pLstCtrl->m_hWnd, styles, styles );
  151. }
  152. //给列表控件CListCtrl增加标题头
  153. void CTestDlg::AddHeaders(CListCtrl* pLstCtrl)
  154. {
  155. TCHAR rgtsz[2][20] = {_T("文件/文件夹名"), 
  156. _T("类型")};
  157. LV_COLUMN lvcolumn;
  158. CRect rect;
  159. pLstCtrl->GetWindowRect(&rect);
  160. for(int i=0;i<2;i++)
  161. {
  162. lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT 
  163. | LVCF_WIDTH | LVCF_ORDER;
  164. lvcolumn.fmt = LVCFMT_LEFT;
  165. lvcolumn.pszText = rgtsz[i];
  166. lvcolumn.iSubItem = i;
  167. lvcolumn.iOrder = i;
  168. if(i==0)
  169. {
  170. lvcolumn.cx = rect.Width()*2/3 ; 
  171. }
  172. else
  173. lvcolumn.cx = rect.Width()/3 ;
  174. pLstCtrl->InsertColumn(i, &lvcolumn);
  175. }
  176. }
  177. //连接FTP服务器
  178. void CTestDlg::OnBtnConnectFTPServer() 
  179. {
  180. UpdateData(TRUE);
  181. //新建CInternetSession对象
  182. m_pIntSession=new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
  183. try 
  184. //新建连接对象
  185. m_pFTPConnection=m_pIntSession->GetFtpConnection(m_StrFTPServer,m_StrUserName,m_StrPassword); 
  186. catch(CInternetException *pEx) 
  187. {
  188. //获取错误信息
  189. TCHAR szError[1024];
  190. if(pEx->GetErrorMessage(szError,1024))
  191. AfxMessageBox(szError);
  192. else  
  193. AfxMessageBox("出现意外情况");
  194. pEx->Delete();
  195. m_pFTPConnection=NULL;
  196. return;
  197. }
  198. m_pRemoteFinder = new CFtpFileFind(m_pFTPConnection);
  199. //获得服务器根目录的所有文件并在列表框中显示
  200. BrowseFolder("",&m_ListRemoteFiles,m_pRemoteFinder,&m_ArrayRemoteFiles);
  201. }
  202. //获得指定目录下的所有文件,并在列表框中显示
  203. void CTestDlg::BrowseFolder(CString strDir,CListCtrl* pLstCtrl,CFileFind* pFinder,CArray<FILEITEM,FILEITEM&>* pFilesArr)
  204. {
  205. //清空列表框
  206. pLstCtrl->DeleteAllItems();
  207. pFilesArr->RemoveAll();
  208. int nIndex = 0;
  209. CString szDir = strDir;
  210. if(szDir.Right(1) != "\")
  211. szDir += "\";
  212. szDir += "*.*";
  213. //查找目录下的文件
  214. BOOL res = pFinder->FindFile(szDir);
  215. while(res)
  216. {
  217. res = pFinder->FindNextFile();
  218. //是目录
  219. if(pFinder->IsDirectory() && !pFinder->IsDots())
  220. {
  221. FILEITEM fileitem;
  222. fileitem.nItem = nIndex;
  223. fileitem.bDir = TRUE;
  224. fileitem.StrFileName = pFinder->GetFileName();
  225. pFilesArr->Add(fileitem);
  226. AddItem(pLstCtrl,nIndex,TRUE,pFinder->GetFileName());
  227. }
  228. //是文件
  229. else if(!pFinder->IsDirectory() && !pFinder->IsDots())
  230. {
  231. FILEITEM fileitem;
  232. fileitem.nItem = nIndex;
  233. fileitem.bDir = FALSE;
  234. fileitem.StrFileName = pFinder->GetFileName();
  235. pFilesArr->Add(fileitem);
  236. AddItem(pLstCtrl,nIndex,FALSE,pFinder->GetFileName());
  237. }
  238. nIndex++;
  239. }
  240. }
  241. //给列表框增加一条记录
  242. void CTestDlg::AddItem(CListCtrl* pLstCtrl,int nIndex,BOOL bDir,CString strText)
  243. {
  244. LV_ITEM lvitem;
  245. int iActualItem;
  246. for(int iSubItem=0;iSubItem<2;iSubItem++)
  247. {
  248. lvitem.mask = LVIF_TEXT|(iSubItem == 0? LVIF_IMAGE : 0);
  249. lvitem.iItem = (iSubItem == 0)? nIndex : iActualItem;
  250. lvitem.iSubItem = iSubItem;
  251. switch(iSubItem)
  252. {
  253. case 0:
  254. lvitem.pszText =(LPTSTR)(LPCTSTR)strText;
  255. break;
  256. case 1:
  257. if(bDir)
  258. lvitem.pszText = "文件夹";
  259. else
  260. lvitem.pszText = "文件";
  261. break;
  262. if (iSubItem == 0)
  263. iActualItem = pLstCtrl->InsertItem(&lvitem);
  264. else
  265. pLstCtrl->SetItem(&lvitem);
  266. }
  267. }
  268. //响应“下载”按钮
  269. void CTestDlg::OnBtnDownloadFile() 
  270. {
  271. //如果没有建立连接,退出
  272. if(m_pFTPConnection==NULL)
  273. {
  274. MessageBox("没有连接FTP服务器!","信息提示",MB_OK);
  275. return;
  276. }
  277. //下载所有选中文件
  278. POSITION pos = m_ListRemoteFiles.GetFirstSelectedItemPosition();
  279. if (pos == NULL)
  280. AfxMessageBox("请选择要下载的文件");
  281. else
  282. {
  283. while (pos)
  284. {
  285. int nItem = m_ListRemoteFiles.GetNextSelectedItem(pos);
  286. DownLoadFile(m_ArrayRemoteFiles.GetAt(nItem));
  287. }
  288. }
  289. }
  290. //响应“上传”按钮
  291. void CTestDlg::OnBtnUpLoadFile() 
  292. {
  293. //如果没有建立连接,退出
  294. if(m_pFTPConnection==NULL)
  295. {
  296. MessageBox("没有连接FTP服务器!","信息提示",MB_OK);
  297. return;
  298. }
  299. //上传所有选中文件
  300. POSITION pos = m_ListLocalFiles.GetFirstSelectedItemPosition();
  301. if (pos == NULL)
  302. AfxMessageBox("请选择要上传的文件");
  303. else
  304. {
  305. while (pos)
  306. {
  307. int nItem = m_ListLocalFiles.GetNextSelectedItem(pos);
  308. UpLoadFile(m_ArrayLocalFiles.GetAt(nItem));
  309. }
  310. }
  311. }
  312. //下载单个文件
  313. void CTestDlg::DownLoadFile(FILEITEM fileItem)
  314. {
  315. if(fileItem.bDir == TRUE)
  316. {
  317. AfxMessageBox("程序暂时不支持下载整个文件夹,请选择文件后下载");
  318. }
  319. else
  320. {
  321. //格式化文件名
  322. CString strLocalFile,strRemoteFile;
  323. strRemoteFile.Format("%s\%s",m_pRemoteFinder->GetRoot(),fileItem.StrFileName);
  324. strLocalFile.Format("%s\%s",m_LocalFinder.GetRoot(),fileItem.StrFileName);
  325. //下载
  326. if(m_pFTPConnection->GetFile(strLocalFile,strLocalFile))
  327. {
  328. CString strMsg;
  329. strMsg.Format("下载文件%s成功!",fileItem.StrFileName);
  330. AfxMessageBox(strMsg);
  331. }
  332. }
  333. }
  334. //上传单个文件
  335. void CTestDlg::UpLoadFile(FILEITEM fileItem)
  336. {
  337. if(fileItem.bDir == TRUE)
  338. {
  339. AfxMessageBox("程序暂时不支持上载整个文件夹,请选择文件后上传");
  340. }
  341. else
  342. {
  343. //格式化文件名
  344. CString strLocalFile,strRemoteFile;
  345. strRemoteFile.Format("%s\%s",m_pRemoteFinder->GetRoot(),fileItem.StrFileName);
  346. strLocalFile.Format("%s\%s",m_LocalFinder.GetRoot(),fileItem.StrFileName);
  347. //上传
  348. if(m_pFTPConnection->PutFile(strLocalFile,strLocalFile))
  349. {
  350. CString strMsg;
  351. strMsg.Format("上传文件%s成功!",fileItem.StrFileName);
  352. AfxMessageBox(strMsg);
  353. }
  354. }
  355. }
  356. //本地文件目录中向上一层
  357. void CTestDlg::OnLocalParentFolder() 
  358. {
  359. if(m_StrLocalParentRoot=="")
  360. return;
  361. BrowseFolder(m_StrLocalParentRoot,&m_ListLocalFiles,&m_LocalFinder,&m_ArrayLocalFiles);
  362. }
  363. //本地文件目录中向下一层
  364. void CTestDlg::OnLocalChildFolder() 
  365. {
  366. POSITION pos = m_ListLocalFiles.GetFirstSelectedItemPosition();
  367. if(pos)
  368. {
  369. int nItem = m_ListRemoteFiles.GetNextSelectedItem(pos);
  370. FILEITEM fileItem = m_ArrayLocalFiles.GetAt(nItem);
  371. if(fileItem.bDir==TRUE)
  372. {
  373. CString strDir;
  374. strDir.Format("%s\%s",m_LocalFinder.GetRoot(),fileItem.StrFileName);
  375. m_StrLocalParentRoot = m_LocalFinder.GetRoot();
  376. BrowseFolder(strDir,&m_ListLocalFiles,&m_LocalFinder,&m_ArrayLocalFiles);
  377. }
  378. }
  379. }
  380. //远程文件目录中向上一层
  381. void CTestDlg::OnRemoteParentFolder() 
  382. {
  383. if(m_pFTPConnection==NULL)
  384. return;
  385. if(m_StrRemoteParentRoot=="")
  386. return;
  387. BrowseFolder(m_StrRemoteParentRoot,&m_ListRemoteFiles,m_pRemoteFinder,&m_ArrayRemoteFiles);
  388. }
  389. //远程文件目录中向下一层
  390. void CTestDlg::OnRemoteChildFolder() 
  391. {
  392. POSITION pos = m_ListRemoteFiles.GetFirstSelectedItemPosition();
  393. if(pos)
  394. {
  395. int nItem = m_ListRemoteFiles.GetNextSelectedItem(pos);
  396. FILEITEM fileItem = m_ArrayRemoteFiles.GetAt(nItem);
  397. if(fileItem.bDir==TRUE)
  398. {
  399. CString strDir;
  400. strDir.Format("%s\%s",m_pRemoteFinder->GetRoot(),fileItem.StrFileName);
  401. m_StrRemoteParentRoot = m_pRemoteFinder->GetRoot();
  402. BrowseFolder(strDir,&m_ListRemoteFiles,m_pRemoteFinder,&m_ArrayRemoteFiles);
  403. }
  404. }
  405. }