百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作

nanshan 2025-03-25 15:54 17 浏览 0 评论

阅读目录

  •  关于本文档的说明
  • 1.基本介绍
  • 2.实际项目
  • 3.调用代码参考
  • 4.FTPClientHelper下载
  • 5.FTP常用的命令

回到目录

 关于本文档的说明

  本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行

  欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利。

  本人自从几年前走上编程之路,一直致力于收集和总结出好用的框架和通用类库,不管是微软自己的还是第三方的只要实际项目中好用且可以解决实际问题那都会收集好,编写好文章和别人一起分享,这样自己学到了,别人也能学到知识,当今社会很需要知识的搬运工。

Email:707055073@qq.com

  本文章地址:http://www.cnblogs.com/wohexiaocai/p/5475506.html

回到目录

1.基本介绍

由于最近的项目是客户端的程序,需要将客户端的图片文件【截图】-【打包】-【ftp上传】,现在就差最后一步了,慢慢的把这些小功能实现了,合并到一起就是一个大功能了,所以一个业务需要拆分的很小很小才可以看清楚,这个项目实际需要用到哪些知识点,下面介绍一下ftp上传的命令

  ftp命令的参考链接:http://jingyan.baidu.com/article/b2c186c8ee1116c46ef6ffc8.html,这是我参考的百度,不全的地方还请大家留言告诉我一下。

  1. ftp适合小文件上传
  2. 对带宽要求要求较高
  3. 服务器的安全性也要考虑到
  4. 命令需要熟悉,不然比较难

回到目录

2.实际项目

  1. 文件上传
  2. 文件下载
  3. 删除文件
  4. 创建文件夹
  5. 文件夹重命名
  6. 删除文件夹
  7. 改变目录
  8. 获取文件夹中文件列表
  9. 等等

2.1 图片上传和下载

写了几个方法,一般用的最多的就是Put,具体的可以下载复制源码下来进行实战一下。

2.2 目录创建和删除

这个方法今天刚好用上了,折腾了一会,才搞定的。

回到目录

3.调用代码参考

由于这个帮助类不是静态的,所以需要实例化

string userName = "xxx";
string password = "xxx";
var ftp = new FTPClientHelper("xxx", ".", userName, password, 1021);

下面还是调用常用的方法,就可以了,因为账号、密码、服务器的IP地址都被我用“xxx”代替了,所以大家自己改下,还有ftp默认端口号是:21,如果有变动还是需要自己改下的。

回到目录

4.FTPClientHelper下载

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

回到目录

5.FTP常用的命令

  1 #region 程序集 System.dll, v4.0.0.0
  2 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll
  3 #endregion
  4 
  5 using System;
  6 
  7 namespace System.Net
  8 {
  9     // 摘要:
 10     //     System.Net.WebRequestMethods.Ftp、System.Net.WebRequestMethods.File 和 System.Net.WebRequestMethods.Http
 11     //     类的容器类。无法继承此类
 12     public static class WebRequestMethods
 13     {
 14 
 15         // 摘要:
 16         //     表示可用于 FILE 请求的文件协议方法的类型。无法继承此类。
 17         public static class File
 18         {
 19             // 摘要:
 20             //     表示用来从指定的位置检索文件的 FILE GET 协议方法。
 21             public const string DownloadFile = "GET";
 22             //
 23             // 摘要:
 24             //     表示用来将文件复制到指定位置的 FILE PUT 协议方法。
 25             public const string UploadFile = "PUT";
 26         }
 27 
 28         // 摘要:
 29         //     表示可与 FTP 请求一起使用的 FTP 协议方法的类型。无法继承此类。
 30         public static class Ftp
 31         {
 32             // 摘要:
 33             //     表示要用于将文件追加到 FTP 服务器上的现有文件的 FTP APPE 协议方法。
 34             public const string AppendFile = "APPE";
 35             //
 36             // 摘要:
 37             //     表示要用于删除 FTP 服务器上的文件的 FTP DELE 协议方法。
 38             public const string DeleteFile = "DELE";
 39             //
 40             // 摘要:
 41             //     表示要用于从 FTP 服务器下载文件的 FTP RETR 协议方法。
 42             public const string DownloadFile = "RETR";
 43             //
 44             // 摘要:
 45             //     表示要用于从 FTP 服务器上的文件检索日期时间戳的 FTP MDTM 协议方法。
 46             public const string GetDateTimestamp = "MDTM";
 47             //
 48             // 摘要:
 49             //     表示要用于检索 FTP 服务器上的文件大小的 FTP SIZE 协议方法。
 50             public const string GetFileSize = "SIZE";
 51             //
 52             // 摘要:
 53             //     表示获取 FTP 服务器上的文件的简短列表的 FTP NLIST 协议方法。
 54             public const string ListDirectory = "NLST";
 55             //
 56             // 摘要:
 57             //     表示获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法。
 58             public const string ListDirectoryDetails = "LIST";
 59             //
 60             // 摘要:
 61             //     表示在 FTP 服务器上创建目录的 FTP MKD 协议方法。
 62             public const string MakeDirectory = "MKD";
 63             //
 64             // 摘要:
 65             //     表示打印当前工作目录的名称的 FTP PWD 协议方法。
 66             public const string PrintWorkingDirectory = "PWD";
 67             //
 68             // 摘要:
 69             //     表示移除目录的 FTP RMD 协议方法。
 70             public const string RemoveDirectory = "RMD";
 71             //
 72             // 摘要:
 73             //     表示重命名目录的 FTP RENAME 协议方法。
 74             public const string Rename = "RENAME";
 75             //
 76             // 摘要:
 77             //     表示将文件上载到 FTP 服务器的 FTP STOR 协议方法。
 78             public const string UploadFile = "STOR";
 79             //
 80             // 摘要:
 81             //     表示将具有唯一名称的文件上载到 FTP 服务器的 FTP STOU 协议方法。
 82             public const string UploadFileWithUniqueName = "STOU";
 83         }
 84 
 85         // 摘要:
 86         //     表示可与 HTTP 请求一起使用的 HTTP 协议方法的类型。
 87         public static class Http
 88         {
 89             // 摘要:
 90             //     表示与代理一起使用的 HTTP CONNECT 协议方法,该代理可以动态切换到隧道,如 SSL 隧道的情况。
 91             public const string Connect = "CONNECT";
 92             //
 93             // 摘要:
 94             //     表示一个 HTTP GET 协议方法。
 95             public const string Get = "GET";
 96             //
 97             // 摘要:
 98             //     表示一个 HTTP HEAD 协议方法。除了服务器在响应中只返回消息头不返回消息体以外,HEAD 方法和 GET 是一样的。
 99             public const string Head = "HEAD";
100             //
101             // 摘要:
102             //     表示一个 HTTP MKCOL 请求,该请求在请求 URI(统一资源标识符)指定的位置新建集合,如页的集合。
103             public const string MkCol = "MKCOL";
104             //
105             // 摘要:
106             //     表示一个 HTTP POST 协议方法,该方法用于将新实体作为补充发送到某个 URI。
107             public const string Post = "POST";
108             //
109             // 摘要:
110             //     表示一个 HTTP PUT 协议方法,该方法用于替换 URI 标识的实体。
111             public const string Put = "PUT";
112         }
113     }
114 }

慢慢积累,你的这些代码都是你的财富,可以帮你提高工作效率,勤勤恳恳的干好每件事情,点滴积累,开心编程。

相关推荐

ubuntu24.04下kubernetes1.30环境搭建

设置root用户密码#在Ubuntu系统中,默认情况下root用户是被禁用的(没有设置密码)#而是通过sudo命令让普通用户临时获取管理员权限,#如果需要启用或修改root密...

Canonical 在 Ubuntu 24.10 发布之前对 Snap 进行了更多改进

作为Ubuntu桌面临时工程总监,OliverSmith介绍了Ubuntu24.10的最新进展。在Ubuntu24.10功能冻结之前,GNOME47测试版已经登陆Ubuntu...

Ubuntu Touch OTA-5手机系统发布:细化电源配置等

IT之家8月2日消息,UBports基金会于7月30日发布UbuntuTouch20.04OTA-5版本更新,距离上次OTA-4更新发布相隔6个月时间。Ubuntu...

Ubuntu更契合英特尔酷睿Ultra,综合性能比Win11高15%

IT之家12月23日消息,英特尔本月推出酷睿UltraMeteorLake处理器,那么Win11和Ubuntu发行版两者时间,谁能更好地发挥其性能呢?国外科技媒体phoron...

针对英特尔酷睿CPU优化,Canonical发布Ubuntu实时内核

IT之家7月27日消息,Canonical今天宣布针对支持时序协调运算(TCC)和时间敏感网络(IEEETSN)的英特尔酷睿处理器,推出优化版实时Ubuntu内核。Canonical...

在Ubuntu/Debian上设置永久DNS域名服务器

在Linux上设置自定义DNS服务器可以提高性能和安全性,甚至可以通过DNS阻止一些使用地理屏蔽的网站。有几种方法可以做到这一点,包括在许多Linux发行版中包括的NetworkManagerGUI...

宣布延期:Ubuntu 24.04 LTS第一个版本发布推迟两周

Ubuntu开发团队原计划于8月19日星期四发布Ubuntu24.04.1LTS。然而,由于发现几个重大升级错误,发布被推迟。Ubuntu24.04.1LTS的新发布日期现定为...

Ubuntu系统已经十岁了 10月新推14.10版

|责编:李鑫比较非主流的Ubuntu系统刚刚推出了14.10版,同时大家也可能不知道其实它已经十岁了!它的第一次公布时间为2004年的10月呢。在这次十周年更新中,Ubuntu为用...

wsl2在休眠后的时间偏差问题的修复

笔记本电脑在日常使用中,常常会有进入休眠状态的情况。休眠对于wsl2而言,却造成了时间偏差的问题,休眠期间wsl2的时间停止了。这个问题的根治,需要等微软。本文提供的是一种简单的修复办法。ntp是网络...

基于Ubuntu22.04源码安装配置RabbitVCS过程记录

基于Ubuntu22.04源码安装配置RabbitVCS过程记录安装开始时间开始时间:2025年7月18日17:09(北京时间)系统:Ubuntu22.04用户:itgather时区:A...

GNOME 46桌面环境发布,Ubuntu 24.04 LTS和Fedora 40率先预装

IT之家3月21日消息,GNOME团队今天发布公告,正式推出代号为“Kathmandu”的GNOME46桌面环境,并已经开放下载。Fedora40发行版将于4月发布,率先预装...

如果大家同意的话 Ubuntu可能很快就会有一个新的垃圾桶图标

Ubuntu贡献者目前正在构思一个新的垃圾桶图标,该图标最早可能在10月份Ubuntu25.10发布时出现在Dock栏中。关于Ubuntu垃圾桶图标外观的讨论在2019年持续进...

Ubuntu 25.10 通过更安全地获取时间来提供进一步的安全性提升

Canonical宣布将从Ubuntu25.10开始使用一款名为chrony的软件,以实现更安全的时间管理。最终用户无需过于担心这一变化,但它将增强系统安全性,尤其是在加密操作和证书验证方...

Linux 修改系统时间的两种方式

一:更新系统时间的方式1、手动修改通过相关工具来手动修改系统的时间。2、自动同步使用NTP自动同步系统时间。二:手动修改系统时间1、date工具作用:显示和设置系统时间选项:-d<字符串&g...

Ubuntu计划下版本为RISC-V设置RVA23基线,大量硬件无法升级

IT之家7月14日消息,主要Linux发行版之一的Ubuntu计划在其接下来的一个大版本25.10中将对RISC-V处理器的准入门槛设置从此前的RVA20配置文件更新至最新...

取消回复欢迎 发表评论: