FROM :http://www.sufeinet.com/forum.php?mod=viewthread&tid=1736&extra=page%3D1%26filter%3Dtypeid%26typeid%3D275%26typeid%3D275

这个类是关于FTP客户端的操作

1.构造函数 

2.字段 服务器账户密码

3.属性

4.链接

5.传输模式

6.文件操作

7.上传和下载

8.目录操作

9.内容函数

  1. using System;
  2. using System.Net;
  3. using System.IO;
  4. using System.Text;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7.  
  8. namespace DotNet.Utilities
  9. {
  10. /// <summary>
  11. /// FTP 操作类客户端
  12. /// </summary>
  13. public class FTPClient
  14. {
  15. public static object obj = new object();
  16.  
  17. #region 构造函数
  18. /// <summary>
  19. /// 缺省构造函数
  20. /// </summary>
  21. public FTPClient()
  22. {
  23. strRemoteHost = "";
  24. strRemotePath = "";
  25. strRemoteUser = "";
  26. strRemotePass = "";
  27. strRemotePort = 21;
  28. bConnected = false;
  29. }
  30.  
  31. /// <summary>
  32. /// 构造函数
  33. /// </summary>
  34. public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
  35. {
  36. strRemoteHost = remoteHost;
  37. strRemotePath = remotePath;
  38. strRemoteUser = remoteUser;
  39. strRemotePass = remotePass;
  40. strRemotePort = remotePort;
  41. Connect();
  42. }
  43. #endregion
  44.  
  45. #region 字段
  46. private int strRemotePort;
  47. private Boolean bConnected;
  48. private string strRemoteHost;
  49. private string strRemotePass;
  50. private string strRemoteUser;
  51. private string strRemotePath;
  52.  
  53. /// <summary>
  54. /// 服务器返回的应答信息(包含应答码)
  55. /// </summary>
  56. private string strMsg;
  57. /// <summary>
  58. /// 服务器返回的应答信息(包含应答码)
  59. /// </summary>
  60. private string strReply;
  61. /// <summary>
  62. /// 服务器返回的应答码
  63. /// </summary>
  64. private int iReplyCode;
  65. /// <summary>
  66. /// 进行控制连接的socket
  67. /// </summary>
  68. private Socket socketControl;
  69. /// <summary>
  70. /// 传输模式
  71. /// </summary>
  72. private TransferType trType;
  73. /// <summary>
  74. /// 接收和发送数据的缓冲区
  75. /// </summary>
  76. private static int BLOCK_SIZE = 512;
  77. /// <summary>
  78. /// 编码方式
  79. /// </summary>
  80. Encoding ASCII = Encoding.ASCII;
  81. /// <summary>
  82. /// 字节数组
  83. /// </summary>
  84. Byte[] buffer = new Byte[BLOCK_SIZE];
  85. #endregion
  86.  
  87. #region 属性
  88. /// <summary>
  89. /// FTP服务器IP地址
  90. /// </summary>
  91. public string RemoteHost
  92. {
  93. get
  94. {
  95. return strRemoteHost;
  96. }
  97. set
  98. {
  99. strRemoteHost = value;
  100. }
  101. }
  102.  
  103. /// <summary>
  104. /// FTP服务器端口
  105. /// </summary>
  106. public int RemotePort
  107. {
  108. get
  109. {
  110. return strRemotePort;
  111. }
  112. set
  113. {
  114. strRemotePort = value;
  115. }
  116. }
  117.  
  118. /// <summary>
  119. /// 当前服务器目录
  120. /// </summary>
  121. public string RemotePath
  122. {
  123. get
  124. {
  125. return strRemotePath;
  126. }
  127. set
  128. {
  129. strRemotePath = value;
  130. }
  131. }
  132.  
  133. /// <summary>
  134. /// 登录用户账号
  135. /// </summary>
  136. public string RemoteUser
  137. {
  138. set
  139. {
  140. strRemoteUser = value;
  141. }
  142. }
  143.  
  144. /// <summary>
  145. /// 用户登录密码
  146. /// </summary>
  147. public string RemotePass
  148. {
  149. set
  150. {
  151. strRemotePass = value;
  152. }
  153. }
  154.  
  155. /// <summary>
  156. /// 是否登录
  157. /// </summary>
  158. public bool Connected
  159. {
  160. get
  161. {
  162. return bConnected;
  163. }
  164. }
  165. #endregion
  166.  
  167. #region 链接
  168. /// <summary>
  169. /// 建立连接
  170. /// </summary>
  171. public void Connect()
  172. {
  173. lock (obj)
  174. {
  175. socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  176. IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
  177. try
  178. {
  179. socketControl.Connect(ep);
  180. }
  181. catch (Exception)
  182. {
  183. throw new IOException("不能连接ftp服务器");
  184. }
  185. }
  186. ReadReply();
  187. if (iReplyCode != 220)
  188. {
  189. DisConnect();
  190. throw new IOException(strReply.Substring(4));
  191. }
  192. SendCommand("USER " + strRemoteUser);
  193. if (!(iReplyCode == 331 || iReplyCode == 230))
  194. {
  195. CloseSocketConnect();
  196. throw new IOException(strReply.Substring(4));
  197. }
  198. if (iReplyCode != 230)
  199. {
  200. SendCommand("PASS " + strRemotePass);
  201. if (!(iReplyCode == 230 || iReplyCode == 202))
  202. {
  203. CloseSocketConnect();
  204. throw new IOException(strReply.Substring(4));
  205. }
  206. }
  207. bConnected = true;
  208. ChDir(strRemotePath);
  209. }
  210.  
  211. /// <summary>
  212. /// 关闭连接
  213. /// </summary>
  214. public void DisConnect()
  215. {
  216. if (socketControl != null)
  217. {
  218. SendCommand("QUIT");
  219. }
  220. CloseSocketConnect();
  221. }
  222. #endregion
  223.  
  224. #region 传输模式
  225. /// <summary>
  226. /// 传输模式:二进制类型、ASCII类型
  227. /// </summary>
  228. public enum TransferType { Binary, ASCII };
  229.  
  230. /// <summary>
  231. /// 设置传输模式
  232. /// </summary>
  233. /// <param name="ttType">传输模式</param>
  234. public void SetTransferType(TransferType ttType)
  235. {
  236. if (ttType == TransferType.Binary)
  237. {
  238. SendCommand("TYPE I");//binary类型传输
  239. }
  240. else
  241. {
  242. SendCommand("TYPE A");//ASCII类型传输
  243. }
  244. if (iReplyCode != 200)
  245. {
  246. throw new IOException(strReply.Substring(4));
  247. }
  248. else
  249. {
  250. trType = ttType;
  251. }
  252. }
  253.  
  254. /// <summary>
  255. /// 获得传输模式
  256. /// </summary>
  257. /// <returns>传输模式</returns>
  258. public TransferType GetTransferType()
  259. {
  260. return trType;
  261. }
  262. #endregion
  263.  
  264. #region 文件操作
  265. /// <summary>
  266. /// 获得文件列表
  267. /// </summary>
  268. /// <param name="strMask">文件名的匹配字符串</param>
  269. public string[] Dir(string strMask)
  270. {
  271. if (!bConnected)
  272. {
  273. Connect();
  274. }
  275. Socket socketData = CreateDataSocket();
  276. SendCommand("NLST " + strMask);
  277. if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
  278. {
  279. throw new IOException(strReply.Substring(4));
  280. }
  281. strMsg = "";
  282. Thread.Sleep(2000);
  283. while (true)
  284. {
  285. int iBytes = socketData.Receive(buffer, buffer.Length, 0);
  286. strMsg += ASCII.GetString(buffer, 0, iBytes);
  287. if (iBytes < buffer.Length)
  288. {
  289. break;
  290. }
  291. }
  292. char[] seperator = { '\n' };
  293. string[] strsFileList = strMsg.Split(seperator);
  294. socketData.Close(); //数据socket关闭时也会有返回码
  295. if (iReplyCode != 226)
  296. {
  297. ReadReply();
  298. if (iReplyCode != 226)
  299. {
  300.  
  301. throw new IOException(strReply.Substring(4));
  302. }
  303. }
  304. return strsFileList;
  305. }
  306.  
  307. public void newPutByGuid(string strFileName, string strGuid)
  308. {
  309. if (!bConnected)
  310. {
  311. Connect();
  312. }
  313. string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
  314. string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
  315. strGuid = str + "\\" + strGuid;
  316. Socket socketData = CreateDataSocket();
  317. SendCommand("STOR " + Path.GetFileName(strGuid));
  318. if (!(iReplyCode == 125 || iReplyCode == 150))
  319. {
  320. throw new IOException(strReply.Substring(4));
  321. }
  322. FileStream input = new FileStream(strGuid, FileMode.Open);
  323. input.Flush();
  324. int iBytes = 0;
  325. while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
  326. {
  327. socketData.Send(buffer, iBytes, 0);
  328. }
  329. input.Close();
  330. if (socketData.Connected)
  331. {
  332. socketData.Close();
  333. }
  334. if (!(iReplyCode == 226 || iReplyCode == 250))
  335. {
  336. ReadReply();
  337. if (!(iReplyCode == 226 || iReplyCode == 250))
  338. {
  339. throw new IOException(strReply.Substring(4));
  340. }
  341. }
  342. }
  343.  
  344. /// <summary>
  345. /// 获取文件大小
  346. /// </summary>
  347. /// <param name="strFileName">文件名</param>
  348. /// <returns>文件大小</returns>
  349. public long GetFileSize(string strFileName)
  350. {
  351. if (!bConnected)
  352. {
  353. Connect();
  354. }
  355. SendCommand("SIZE " + Path.GetFileName(strFileName));
  356. long lSize = 0;
  357. if (iReplyCode == 213)
  358. {
  359. lSize = Int64.Parse(strReply.Substring(4));
  360. }
  361. else
  362. {
  363. throw new IOException(strReply.Substring(4));
  364. }
  365. return lSize;
  366. }
  367.  
  368. /// <summary>
  369. /// 获取文件信息
  370. /// </summary>
  371. /// <param name="strFileName">文件名</param>
  372. /// <returns>文件大小</returns>
  373. public string GetFileInfo(string strFileName)
  374. {
  375. if (!bConnected)
  376. {
  377. Connect();
  378. }
  379. Socket socketData = CreateDataSocket();
  380. SendCommand("LIST " + strFileName);
  381. string strResult = "";
  382. if (!(iReplyCode == 150 || iReplyCode == 125
  383. || iReplyCode == 226 || iReplyCode == 250))
  384. {
  385. throw new IOException(strReply.Substring(4));
  386. }
  387. byte[] b = new byte[512];
  388. MemoryStream ms = new MemoryStream();
  389.  
  390. while (true)
  391. {
  392. int iBytes = socketData.Receive(b, b.Length, 0);
  393. ms.Write(b, 0, iBytes);
  394. if (iBytes <= 0)
  395. {
  396.  
  397. break;
  398. }
  399. }
  400. byte[] bt = ms.GetBuffer();
  401. strResult = System.Text.Encoding.ASCII.GetString(bt);
  402. ms.Close();
  403. return strResult;
  404. }
  405.  
  406. /// <summary>
  407. /// 删除
  408. /// </summary>
  409. /// <param name="strFileName">待删除文件名</param>
  410. public void Delete(string strFileName)
  411. {
  412. if (!bConnected)
  413. {
  414. Connect();
  415. }
  416. SendCommand("DELE " + strFileName);
  417. if (iReplyCode != 250)
  418. {
  419. throw new IOException(strReply.Substring(4));
  420. }
  421. }
  422.  
  423. /// <summary>
  424. /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
  425. /// </summary>
  426. /// <param name="strOldFileName">旧文件名</param>
  427. /// <param name="strNewFileName">新文件名</param>
  428. public void Rename(string strOldFileName, string strNewFileName)
  429. {
  430. if (!bConnected)
  431. {
  432. Connect();
  433. }
  434. SendCommand("RNFR " + strOldFileName);
  435. if (iReplyCode != 350)
  436. {
  437. throw new IOException(strReply.Substring(4));
  438. }
  439. // 如果新文件名与原有文件重名,将覆盖原有文件
  440. SendCommand("RNTO " + strNewFileName);
  441. if (iReplyCode != 250)
  442. {
  443. throw new IOException(strReply.Substring(4));
  444. }
  445. }
  446. #endregion
  447.  
  448. #region 上传和下载
  449. /// <summary>
  450. /// 下载一批文件
  451. /// </summary>
  452. /// <param name="strFileNameMask">文件名的匹配字符串</param>
  453. /// <param name="strFolder">本地目录(不得以\结束)</param>
  454. public void Get(string strFileNameMask, string strFolder)
  455. {
  456. if (!bConnected)
  457. {
  458. Connect();
  459. }
  460. string[] strFiles = Dir(strFileNameMask);
  461. foreach (string strFile in strFiles)
  462. {
  463. if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
  464. {
  465. Get(strFile, strFolder, strFile);
  466. }
  467. }
  468. }
  469.  
  470. /// <summary>
  471. /// 下载一个文件
  472. /// </summary>
  473. /// <param name="strRemoteFileName">要下载的文件名</param>
  474. /// <param name="strFolder">本地目录(不得以\结束)</param>
  475. /// <param name="strLocalFileName">保存在本地时的文件名</param>
  476. public void Get(string strRemoteFileName, string strFolder, string strLocalFileName)
  477. {
  478. Socket socketData = CreateDataSocket();
  479. try
  480. {
  481. if (!bConnected)
  482. {
  483. Connect();
  484. }
  485. SetTransferType(TransferType.Binary);
  486. if (strLocalFileName.Equals(""))
  487. {
  488. strLocalFileName = strRemoteFileName;
  489. }
  490. SendCommand("RETR " + strRemoteFileName);
  491. if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250))
  492. {
  493. throw new IOException(strReply.Substring(4));
  494. }
  495. FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
  496. while (true)
  497. {
  498. int iBytes = socketData.Receive(buffer, buffer.Length, 0);
  499. output.Write(buffer, 0, iBytes);
  500. if (iBytes <= 0)
  501. {
  502. break;
  503. }
  504. }
  505. output.Close();
  506. if (socketData.Connected)
  507. {
  508. socketData.Close();
  509. }
  510. if (!(iReplyCode == 226 || iReplyCode == 250))
  511. {
  512. ReadReply();
  513. if (!(iReplyCode == 226 || iReplyCode == 250))
  514. {
  515. throw new IOException(strReply.Substring(4));
  516. }
  517. }
  518. }
  519. catch
  520. {
  521. socketData.Close();
  522. socketData = null;
  523. socketControl.Close();
  524. bConnected = false;
  525. socketControl = null;
  526. }
  527. }
  528.  
  529. /// <summary>
  530. /// 下载一个文件
  531. /// </summary>
  532. /// <param name="strRemoteFileName">要下载的文件名</param>
  533. /// <param name="strFolder">本地目录(不得以\结束)</param>
  534. /// <param name="strLocalFileName">保存在本地时的文件名</param>
  535. public void GetNoBinary(string strRemoteFileName, string strFolder, string strLocalFileName)
  536. {
  537. if (!bConnected)
  538. {
  539. Connect();
  540. }
  541.  
  542. if (strLocalFileName.Equals(""))
  543. {
  544. strLocalFileName = strRemoteFileName;
  545. }
  546. Socket socketData = CreateDataSocket();
  547. SendCommand("RETR " + strRemoteFileName);
  548. if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250))
  549. {
  550. throw new IOException(strReply.Substring(4));
  551. }
  552. FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
  553. while (true)
  554. {
  555. int iBytes = socketData.Receive(buffer, buffer.Length, 0);
  556. output.Write(buffer, 0, iBytes);
  557. if (iBytes <= 0)
  558. {
  559. break;
  560. }
  561. }
  562. output.Close();
  563. if (socketData.Connected)
  564. {
  565. socketData.Close();
  566. }
  567. if (!(iReplyCode == 226 || iReplyCode == 250))
  568. {
  569. ReadReply();
  570. if (!(iReplyCode == 226 || iReplyCode == 250))
  571. {
  572. throw new IOException(strReply.Substring(4));
  573. }
  574. }
  575. }
  576.  
  577. /// <summary>
  578. /// 上传一批文件
  579. /// </summary>
  580. /// <param name="strFolder">本地目录(不得以\结束)</param>
  581. /// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
  582. public void Put(string strFolder, string strFileNameMask)
  583. {
  584. string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
  585. foreach (string strFile in strFiles)
  586. {
  587. Put(strFile);
  588. }
  589. }
  590.  
  591. /// <summary>
  592. /// 上传一个文件
  593. /// </summary>
  594. /// <param name="strFileName">本地文件名</param>
  595. public void Put(string strFileName)
  596. {
  597. if (!bConnected)
  598. {
  599. Connect();
  600. }
  601. Socket socketData = CreateDataSocket();
  602. if (Path.GetExtension(strFileName) == "")
  603. SendCommand("STOR " + Path.GetFileNameWithoutExtension(strFileName));
  604. else
  605. SendCommand("STOR " + Path.GetFileName(strFileName));
  606.  
  607. if (!(iReplyCode == 125 || iReplyCode == 150))
  608. {
  609. throw new IOException(strReply.Substring(4));
  610. }
  611.  
  612. FileStream input = new FileStream(strFileName, FileMode.Open);
  613. int iBytes = 0;
  614. while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
  615. {
  616. socketData.Send(buffer, iBytes, 0);
  617. }
  618. input.Close();
  619. if (socketData.Connected)
  620. {
  621. socketData.Close();
  622. }
  623. if (!(iReplyCode == 226 || iReplyCode == 250))
  624. {
  625. ReadReply();
  626. if (!(iReplyCode == 226 || iReplyCode == 250))
  627. {
  628. throw new IOException(strReply.Substring(4));
  629. }
  630. }
  631. }
  632.  
  633. /// <summary>
  634. /// 上传一个文件
  635. /// </summary>
  636. /// <param name="strFileName">本地文件名</param>
  637. public void PutByGuid(string strFileName, string strGuid)
  638. {
  639. if (!bConnected)
  640. {
  641. Connect();
  642. }
  643. string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
  644. string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
  645. strGuid = str + "\\" + strGuid;
  646. System.IO.File.Copy(strFileName, strGuid);
  647. System.IO.File.SetAttributes(strGuid, System.IO.FileAttributes.Normal);
  648. Socket socketData = CreateDataSocket();
  649. SendCommand("STOR " + Path.GetFileName(strGuid));
  650. if (!(iReplyCode == 125 || iReplyCode == 150))
  651. {
  652. throw new IOException(strReply.Substring(4));
  653. }
  654. FileStream input = new FileStream(strGuid, FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
  655. int iBytes = 0;
  656. while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
  657. {
  658. socketData.Send(buffer, iBytes, 0);
  659. }
  660. input.Close();
  661. File.Delete(strGuid);
  662. if (socketData.Connected)
  663. {
  664. socketData.Close();
  665. }
  666. if (!(iReplyCode == 226 || iReplyCode == 250))
  667. {
  668. ReadReply();
  669. if (!(iReplyCode == 226 || iReplyCode == 250))
  670. {
  671. throw new IOException(strReply.Substring(4));
  672. }
  673. }
  674. }
  675. #endregion
  676.  
  677. #region 目录操作
  678. /// <summary>
  679. /// 创建目录
  680. /// </summary>
  681. /// <param name="strDirName">目录名</param>
  682. public void MkDir(string strDirName)
  683. {
  684. if (!bConnected)
  685. {
  686. Connect();
  687. }
  688. SendCommand("MKD " + strDirName);
  689. if (iReplyCode != 257)
  690. {
  691. throw new IOException(strReply.Substring(4));
  692. }
  693. }
  694.  
  695. /// <summary>
  696. /// 删除目录
  697. /// </summary>
  698. /// <param name="strDirName">目录名</param>
  699. public void RmDir(string strDirName)
  700. {
  701. if (!bConnected)
  702. {
  703. Connect();
  704. }
  705. SendCommand("RMD " + strDirName);
  706. if (iReplyCode != 250)
  707. {
  708. throw new IOException(strReply.Substring(4));
  709. }
  710. }
  711.  
  712. /// <summary>
  713. /// 改变目录
  714. /// </summary>
  715. /// <param name="strDirName">新的工作目录名</param>
  716. public void ChDir(string strDirName)
  717. {
  718. if (strDirName.Equals(".") || strDirName.Equals(""))
  719. {
  720. return;
  721. }
  722. if (!bConnected)
  723. {
  724. Connect();
  725. }
  726. SendCommand("CWD " + strDirName);
  727. if (iReplyCode != 250)
  728. {
  729. throw new IOException(strReply.Substring(4));
  730. }
  731. this.strRemotePath = strDirName;
  732. }
  733. #endregion
  734.  
  735. #region 内部函数
  736. /// <summary>
  737. /// 将一行应答字符串记录在strReply和strMsg,应答码记录在iReplyCode
  738. /// </summary>
  739. private void ReadReply()
  740. {
  741. strMsg = "";
  742. strReply = ReadLine();
  743. iReplyCode = Int32.Parse(strReply.Substring(0, 3));
  744. }
  745.  
  746. /// <summary>
  747. /// 建立进行数据连接的socket
  748. /// </summary>
  749. /// <returns>数据连接socket</returns>
  750. private Socket CreateDataSocket()
  751. {
  752. SendCommand("PASV");
  753. if (iReplyCode != 227)
  754. {
  755. throw new IOException(strReply.Substring(4));
  756. }
  757. int index1 = strReply.IndexOf('(');
  758. int index2 = strReply.IndexOf(')');
  759. string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1);
  760. int[] parts = new int[6];
  761. int len = ipData.Length;
  762. int partCount = 0;
  763. string buf = "";
  764. for (int i = 0; i < len && partCount <= 6; i++)
  765. {
  766. char ch = Char.Parse(ipData.Substring(i, 1));
  767. if (Char.IsDigit(ch))
  768. buf += ch;
  769. else if (ch != ',')
  770. {
  771. throw new IOException("Malformed PASV strReply: " + strReply);
  772. }
  773. if (ch == ',' || i + 1 == len)
  774. {
  775. try
  776. {
  777. parts[partCount++] = Int32.Parse(buf);
  778. buf = "";
  779. }
  780. catch (Exception)
  781. {
  782. throw new IOException("Malformed PASV strReply: " + strReply);
  783. }
  784. }
  785. }
  786. string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3];
  787. int port = (parts[4] << 8) + parts[5];
  788. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  789. IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);
  790. try
  791. {
  792. s.Connect(ep);
  793. }
  794. catch (Exception)
  795. {
  796. throw new IOException("无法连接ftp服务器");
  797. }
  798. return s;
  799. }
  800.  
  801. /// <summary>
  802. /// 关闭socket连接(用于登录以前)
  803. /// </summary>
  804. private void CloseSocketConnect()
  805. {
  806. lock (obj)
  807. {
  808. if (socketControl != null)
  809. {
  810. socketControl.Close();
  811. socketControl = null;
  812. }
  813. bConnected = false;
  814. }
  815. }
  816.  
  817. /// <summary>
  818. /// 读取Socket返回的所有字符串
  819. /// </summary>
  820. /// <returns>包含应答码的字符串行</returns>
  821. private string ReadLine()
  822. {
  823. lock (obj)
  824. {
  825. while (true)
  826. {
  827. int iBytes = socketControl.Receive(buffer, buffer.Length, 0);
  828. strMsg += ASCII.GetString(buffer, 0, iBytes);
  829. if (iBytes < buffer.Length)
  830. {
  831. break;
  832. }
  833. }
  834. }
  835. char[] seperator = { '\n' };
  836. string[] mess = strMsg.Split(seperator);
  837. if (strMsg.Length > 2)
  838. {
  839. strMsg = mess[mess.Length - 2];
  840. }
  841. else
  842. {
  843. strMsg = mess[0];
  844. }
  845. if (!strMsg.Substring(3, 1).Equals(" ")) //返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
  846. {
  847. return ReadLine();
  848. }
  849. return strMsg;
  850. }
  851.  
  852. /// <summary>
  853. /// 发送命令并获取应答码和最后一行应答字符串
  854. /// </summary>
  855. /// <param name="strCommand">命令</param>
  856. public void SendCommand(String strCommand)
  857. {
  858. lock (obj)
  859. {
  860. Byte[] cmdBytes = Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
  861. socketControl.Send(cmdBytes, cmdBytes.Length, 0);
  862. Thread.Sleep(500);
  863. ReadReply();
  864. }
  865. }
  866. #endregion
  867. }
  868. }

C# FTPClient--FTP操作帮助类,上传下载,文件,目录操作的更多相关文章

  1. 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件

    在Windows上使用终端模拟程序连接操作Linux以及上传下载文件 [很简单,就是一个工具的使用而已,放这里是做个笔记.] 刚买的云主机,或者是虚拟机里安装的Linux系统,可能会涉及到在windo ...

  2. vb.net FTP上传下载,目录操作

    https://blog.csdn.net/dzweather/article/details/51429107 FtpWebRequest与FtpWebResponse类用来与特定FTP服务器进行沟 ...

  3. Android和FTP服务器交互,上传下载文件(实例demo)

    今天同学说他备份了联系人的数据放在一个文件里,想把它存到服务器上,以便之后可以进行下载恢复..于是帮他写了个上传,下载文件的demo 主要是 跟FTP服务器打交道-因为这个东东有免费的可以身亲哈 1. ...

  4. C# FluentFTP类上传下载文件

    前言:最近要实现从FTP服务器下载和上传文件,在网上搜了一下据说 FluentFTP 是个客户端FTP功能的实现,使用还比较顺畅,所以对此展开研究,无奈网上给出的案例并没有想象中的那么简洁,所以想着自 ...

  5. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

  6. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  7. SFTP上传下载文件、文件夹常用操作

    SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...

  8. FTP上传下载文件(函数简易版)

    FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...

  9. 向linux服务器上传下载文件方式收集

    向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...

  10. 【liunx命令】上传下载文件的方法

    scp   帮助命令: man scp   scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择.   从远程主机 下载东西到 本地电脑 ...

随机推荐

  1. leetcode之Largest Rectangle in Histogram

    问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...

  2. [CSDN_Markdown]Markdown基本语法2

    简介 前文 Markdown基本语法 中介绍了Markdown的基本语法,知道那些基本的语法,实际上已经可以写纯文本的博客了.对我们这群写代码的人或者将要写代码的人来说,貌似这些还不够,我们还希望能插 ...

  3. Angular2入坑指南

    序 对后端开发来说,前端是神秘的,眼花缭乱的技术,繁多的框架,出名的不出名的好几百种,看是"繁荣",其实显得杂乱无章,但是我们在做开发的时候,技术选型还是主流的那么几个:浅析ang ...

  4. springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)

    在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...

  5. 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。

    #include <iostream> using namespace std; //循环队列(少用一个空间)长度 #define M (8+1) typedef struct node ...

  6. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field 异常

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 1.1.1. 前言 近期在使用ObjectMapper对象将jso ...

  7. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  8. 使用Myeclipse10.0自动生成搭建SSH框架(数据库表自动反向转换成Hibernate实体)实现用户登陆

    我这里使用的数据库是mysql5.0 数据是上课用的.这些都不是重点,重要的是学会这个方法: 创建好数据库: create database jboadefault character set utf ...

  9. java.util.ServiceLoader使用

    近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到properties中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究java中有没有 ...

  10. 第一行代码阅读笔记---AndroidMainfest.xml分析

    按照这本书的指引,我随作者一样创建了一个安卓应用,开始了安卓开发的启程. 找到AndroidMainfest.xml这个文件,打开后看到了我创建的Activity在这个文件里被成功注册,文件内容如下: ...