FtpDlg.cpp
上传用户:job1860
上传日期:2021-12-04
资源大小:1510k
文件大小:8k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // FtpDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyFtp.h"
  5. #include "FtpDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CFtpDlg dialog
  13. CFtpDlg::CFtpDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CFtpDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CFtpDlg)
  17. // NOTE: the ClassWizard will add member initialization here
  18. m_pConnection = NULL;
  19. m_pFileFind = NULL;
  20. //}}AFX_DATA_INIT
  21. }
  22. void CFtpDlg::DoDataExchange(CDataExchange* pDX)
  23. {
  24. CDialog::DoDataExchange(pDX);
  25. //{{AFX_DATA_MAP(CFtpDlg)
  26. DDX_Control(pDX, IDC_DELETE, m_BtnDelete);
  27. DDX_Control(pDX, IDC_RENAME, m_BtnRename);
  28. DDX_Control(pDX, IDC_QUARY, m_BtnQuery);
  29. DDX_Control(pDX, IDC_UPLOAD, m_BtnUpLoad);
  30. DDX_Control(pDX, IDC_DOWNLOAD, m_BtnDownLoad);
  31. DDX_Control(pDX, IDC_LIST_FILE, m_FtpFile);
  32. //}}AFX_DATA_MAP
  33. }
  34. BEGIN_MESSAGE_MAP(CFtpDlg, CDialog)
  35. //{{AFX_MSG_MAP(CFtpDlg)
  36. ON_BN_CLICKED(IDC_QUARY, OnQuary)
  37. ON_BN_CLICKED(IDC_EXIT, OnExit)
  38. ON_BN_CLICKED(IDC_DOWNLOAD, OnDownload)
  39. ON_BN_CLICKED(IDC_UPLOAD, OnUpload)
  40. ON_BN_CLICKED(IDC_RENAME, OnRename)
  41. ON_BN_CLICKED(IDC_DELETE, OnDelete)
  42. ON_BN_CLICKED(IDC_NEXTDIRECTORY, OnNextdirectory)
  43. ON_BN_CLICKED(IDC_LASTDIRECTORY, OnLastdirectory)
  44. ON_NOTIFY(NM_DBLCLK, IDC_LIST_FILE, OnDblclkListFile)
  45. //}}AFX_MSG_MAP
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CFtpDlg message handlers
  49. BOOL CFtpDlg::OnInitDialog() 
  50. {
  51. CDialog::OnInitDialog();
  52. // TODO: Add extra initialization here
  53. //设置CListCtrl对象的属性
  54. m_FtpFile.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
  55. //m_FtpFile.SetBkColor(RGB(22,100,100));
  56. m_FtpFile.InsertColumn(0,"文件名",LVCFMT_CENTER,200);
  57. m_FtpFile.InsertColumn(1,"日期",LVCFMT_CENTER,100);
  58. m_FtpFile.InsertColumn(2,"字节数",LVCFMT_CENTER,100);
  59.     m_pFileFind = new CFtpFileFind(m_pConnection);
  60. OnQuary();
  61. return TRUE; 
  62. // return TRUE unless you set the focus to a control
  63. // EXCEPTION: OCX Property Pages should return FALSE
  64. }
  65. //得到服务器当前目录的文件列表
  66. void CFtpDlg::OnQuary() 
  67. {
  68. ListContent("*");
  69. }
  70. //用于显示当前目录下所有的子目录与文件
  71. void CFtpDlg::ListContent(LPCTSTR DirName)
  72. {
  73. m_FtpFile.DeleteAllItems();
  74. BOOL bContinue;
  75. bContinue=m_pFileFind->FindFile(DirName);
  76. if (!bContinue)
  77. {
  78. //查找完毕,失败
  79. m_pFileFind->Close();
  80. m_pFileFind=NULL;
  81. }
  82. CString strFileName;
  83. CString strFileTime;
  84. CString strFileLength;
  85. while (bContinue)
  86. {
  87. bContinue = m_pFileFind->FindNextFile();
  88. strFileName = m_pFileFind->GetFileName(); //得到文件名
  89. //得到文件最后一次修改的时间
  90. FILETIME ft;
  91. m_pFileFind->GetLastWriteTime(&ft);       
  92. CTime FileTime(ft);
  93. strFileTime = FileTime.Format("%y/%m/%d");
  94.         
  95. if (m_pFileFind->IsDirectory())
  96. {
  97. //如果是目录不求大小,用<DIR>代替
  98. strFileLength = "<DIR>";
  99. }
  100. else
  101. {
  102. //得到文件大小
  103. if (m_pFileFind->GetLength64() <1024)
  104. {
  105. strFileLength.Format("%d B",m_pFileFind->GetLength64());
  106. }
  107. else    
  108. {  
  109. if (m_pFileFind->GetLength64() < (1024*1024))  
  110. strFileLength.Format("%3.3f KB",  
  111. (LONGLONG)m_pFileFind->GetLength64()/1024.0);  
  112. else    
  113. {  
  114. if   (m_pFileFind->GetLength64()<(1024*1024*1024))  
  115. strFileLength.Format("%3.3f MB",    
  116. (LONGLONG)m_pFileFind->GetLength64()/(1024*1024.0));  
  117. else  
  118. strFileLength.Format("%1.3f GB",    
  119. (LONGLONG)m_pFileFind->GetLength64()/(1024.0*1024*1024));  
  120. }  
  121. }
  122. }
  123. int i=0;
  124.         m_FtpFile.InsertItem(i,strFileName,0);
  125. m_FtpFile.SetItemText(i,1,strFileTime);
  126. m_FtpFile.SetItemText(i,2,strFileLength);
  127. i++;
  128. }
  129. }
  130. void CFtpDlg::OnDownload() 
  131. {
  132. // TODO: Add your control notification handler code here
  133. //禁用一点按钮
  134. int i=m_FtpFile.GetNextItem(-1,LVNI_SELECTED); 
  135. if (i==-1)
  136. {
  137.         AfxMessageBox("没有选择文件!",MB_OK | MB_ICONQUESTION);
  138. }
  139. else
  140. {
  141.         CString strType=m_FtpFile.GetItemText(i,2);   //得到选择项的类型
  142. if (strType!="<DIR>")   //选择的是文件
  143. {
  144. CString strDestName;
  145. CString strSourceName;
  146. strSourceName = m_FtpFile.GetItemText(i,0);//得到所要下载的文件名
  147. CFileDialog dlg(FALSE,"",strSourceName);
  148. if (dlg.DoModal()==IDOK)
  149. {
  150. //获得下载文件在本地机上存储的路径和名称
  151. strDestName=dlg.GetPathName();
  152. //调用CFtpConnect类中的GetFile函数下载文件
  153. if (m_pConnection->GetFile(strSourceName,strDestName))
  154. AfxMessageBox("下载成功!",MB_OK|MB_ICONINFORMATION);
  155. else
  156. AfxMessageBox("下载失败!",MB_OK|MB_ICONSTOP);
  157. }
  158. }
  159. else
  160. {
  161. //选择的是目录
  162. AfxMessageBox("不能下载目录!n请重选!",MB_OK|MB_ICONSTOP);
  163. }
  164. }
  165. // MessageBox(str);
  166. }
  167. void CFtpDlg::OnUpload() 
  168. {
  169. // TODO: Add your control notification handler code here
  170. //获得当前输入
  171. //禁用查询按钮
  172. CString strSourceName;
  173. CString strDestName;
  174. CFileDialog dlg(TRUE,"","*.*");
  175. if (dlg.DoModal()==IDOK)
  176. {
  177. //获得待上传的本地机文件路径和文件名
  178. strSourceName = dlg.GetPathName();
  179. strDestName = dlg.GetFileName();
  180. //调用CFtpConnect类中的PutFile函数上传文件
  181. if (m_pConnection->PutFile(strSourceName,strDestName))
  182. AfxMessageBox("上传成功!",MB_OK|MB_ICONINFORMATION);
  183. else
  184. AfxMessageBox("上传失败!",MB_OK|MB_ICONSTOP);
  185. }
  186.     OnQuary();
  187. }
  188. void CFtpDlg::OnRename() 
  189. {
  190. // TODO: Add your control notification handler code here
  191. CString strNewName;
  192. CString strOldName;
  193. int i=m_FtpFile.GetNextItem(-1,LVNI_SELECTED); //得到CListCtrl被选中的项
  194. if (i==-1)
  195. {
  196.         AfxMessageBox("没有选择文件!",MB_OK | MB_ICONQUESTION);
  197. }
  198. else
  199. {
  200.         strOldName = m_FtpFile.GetItemText(i,0);//得到所选择的文件名
  201. CNewNameDlg dlg;
  202. if (dlg.DoModal()==IDOK)
  203. {
  204. strNewName=dlg.m_NewFileName;
  205. if (m_pConnection->Rename(strOldName,strNewName))
  206. AfxMessageBox("重命名成功!",MB_OK|MB_ICONINFORMATION);
  207. else
  208. AfxMessageBox("无法重命名!",MB_OK|MB_ICONSTOP);
  209. }
  210. }
  211. OnQuary();
  212. }
  213. //删除选择的文件
  214. void CFtpDlg::OnDelete() 
  215. {
  216. // TODO: Add your control notification handler code here
  217. int i=m_FtpFile.GetNextItem(-1,LVNI_SELECTED); 
  218. if (i==-1)
  219. {
  220.         AfxMessageBox("没有选择文件!",MB_OK | MB_ICONQUESTION);
  221. }
  222. else
  223. {
  224. CString  strFileName;
  225. strFileName = m_FtpFile.GetItemText(i,0);
  226. if ("<DIR>"==m_FtpFile.GetItemText(i,2))
  227. {
  228. AfxMessageBox("不能删除目录!",MB_OK | MB_ICONSTOP);
  229. }
  230. else
  231. {
  232. if (m_pConnection->Remove(strFileName))
  233. AfxMessageBox("删除成功!",MB_OK|MB_ICONINFORMATION);
  234. else
  235. AfxMessageBox("无法删除!",MB_OK|MB_ICONSTOP);
  236. }
  237. }
  238. OnQuary();
  239. }
  240. void CFtpDlg::OnNextdirectory() 
  241. {
  242. static CString  strCurrentDirectory, strSub;
  243.     m_pConnection->GetCurrentDirectory(strCurrentDirectory);
  244. strCurrentDirectory+="/";
  245. //得到所选择的文本
  246. int i=m_FtpFile.GetNextItem(-1,LVNI_SELECTED); 
  247. strSub = m_FtpFile.GetItemText(i,0);
  248. if (i==-1)
  249. {
  250.         AfxMessageBox("没有选择目录!",MB_OK | MB_ICONQUESTION);
  251. }
  252. else
  253. {   //判断是不是目录
  254. if ("<DIR>"!=m_FtpFile.GetItemText(i,2))
  255. {
  256. AfxMessageBox("不是子目录!",MB_OK | MB_ICONSTOP);
  257. }
  258. else
  259. {
  260.             //设置当前目录
  261. m_pConnection->SetCurrentDirectory(strCurrentDirectory+strSub);
  262. //对当前目录进行查询
  263. ListContent("*");
  264. }
  265. }
  266. }
  267. //返回上一级目录
  268. void CFtpDlg::OnLastdirectory() 
  269. {
  270. static CString  strCurrentDirectory;
  271.     m_pConnection->GetCurrentDirectory(strCurrentDirectory);
  272. if (strCurrentDirectory == "/")
  273. {
  274. AfxMessageBox("已经是根目录了!",MB_OK | MB_ICONSTOP);
  275. }
  276. else
  277. {
  278.         GetLastDiretory(strCurrentDirectory);
  279.         //设置当前目录
  280.         m_pConnection->SetCurrentDirectory(strCurrentDirectory);
  281. //对当前目录进行查询
  282.         ListContent("*");
  283. }
  284. }
  285. //一工具函数,用于得到上一级目录的字符串表示
  286. void CFtpDlg::GetLastDiretory(CString &str)
  287. {
  288. int LastIndex=0;
  289. for (int i=0; i<str.GetLength(); i++)
  290. {
  291. if (str.GetAt(i)=='/')
  292. LastIndex = i;
  293. }
  294. str = str.Left(LastIndex);
  295. if (LastIndex == 0)
  296. str="/";
  297. }
  298. //当双击的时候,调用下一级目录代码,对文件不起作用
  299. void CFtpDlg::OnDblclkListFile(NMHDR* pNMHDR, LRESULT* pResult) 
  300. {
  301. // TODO: Add your control notification handler code here
  302. OnNextdirectory();
  303. *pResult = 0;
  304. }
  305. //退出对话框响应函数
  306. void CFtpDlg::OnExit() 
  307. {
  308. // TODO: Add your control notification handler code here
  309. m_pConnection = NULL;
  310. m_pFileFind = NULL;
  311. DestroyWindow();
  312. }