好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

c#上传下载ftp(支持断点续传)

c#上传下载ftp(支持断点续传)

这个ftpClient是从网上找来的,自己加了断点续传的方法

using  System;
using  System.Net;
using  System.IO;
using  System.Text;
using  System.Net.Sockets;

namespace  ftpGet
{
     ///   <summary>
     ///  FTP Client
     ///   </summary>
     public   class  FTPClient
     {
         #region  构造函数
         ///   <summary>
         ///  缺省构造函数
         ///   </summary>
         public  FTPClient()
         {
            strRemoteHost =  "" ;
            strRemotePath =  "" ;
            strRemoteUser =  "" ;
            strRemotePass =  "" ;
            strRemotePort =  21 ;
            bConnected =  false ;
        }

         ///   <summary>
         ///  构造函数
         ///   </summary>
         ///   <param name="remoteHost"> FTP服务器IP地址 </param>
         ///   <param name="remotePath"> 当前服务器目录 </param>
         ///   <param name="remoteUser"> 登录用户账号 </param>
         ///   <param name="remotePass"> 登录用户密码 </param>
         ///   <param name="remotePort"> FTP服务器端口 </param>
         public  FTPClient( string  remoteHost,  string  remotePath,  string  remoteUser,  string  remotePass,  int  remotePort)
         {
            strRemoteHost = remoteHost;
            strRemotePath = remotePath;
            strRemoteUser = remoteUser;
            strRemotePass = remotePass;
            strRemotePort = remotePort;
            Connect();
        }
         #endregion

         #region  登陆字段、属性
         ///   <summary>
         ///  FTP服务器IP地址
         ///   </summary>
         private   string  strRemoteHost;
         public   string  RemoteHost
         {
             get
             {
                 return  strRemoteHost;
            }
             set
             {
                strRemoteHost = value;
            }
        }
         ///   <summary>
         ///  FTP服务器端口
         ///   </summary>
         private   int  strRemotePort;
         public   int  RemotePort
         {
             get
             {
                 return  strRemotePort;
            }
             set
             {
                strRemotePort = value;
            }
        }
         ///   <summary>
         ///  当前服务器目录
         ///   </summary>
         private   string  strRemotePath;
         public   string  RemotePath
         {
             get
             {
                 return  strRemotePath;
            }
             set
             {
                strRemotePath = value;
            }
        }
         ///   <summary>
         ///  登录用户账号
         ///   </summary>
         private   string  strRemoteUser;
         public   string  RemoteUser
         {
             set
             {
                strRemoteUser = value;
            }
        }
         ///   <summary>
         ///  用户登录密码
         ///   </summary>
         private   string  strRemotePass;
         public   string  RemotePass
         {
             set
             {
                strRemotePass = value;
            }
        }

         ///   <summary>
         ///  是否登录
         ///   </summary>
         private  Boolean bConnected;
         public   bool  Connected
         {
             get
             {
                 return  bConnected;
            }
        }
         #endregion

         #region  链接
         ///   <summary>
         ///  建立连接 
         ///   </summary>
         public   void  Connect()
         {
            socketControl =  new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ep =  new  IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
             //  链接
             try
             {
                socketControl.Connect(ep);
            }
             catch  (Exception)
             {
                 throw   new  IOException( " Couldn't connect to remote server " );
            }

             //  获取应答码
            ReadReply();
             if  (iReplyCode !=  220 )
             {
                DisConnect();
                 throw   new  IOException(strReply.Substring( 4 ));
            }

             //  登陆
            SendCommand( " USER  "  + strRemoteUser);
             if  (!(iReplyCode ==  331  || iReplyCode ==  230 ))
             {
                CloseSocketConnect(); // 关闭连接
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             if  (iReplyCode !=  230 )
             {
                SendCommand( " PASS  "  + strRemotePass);
                 if  (!(iReplyCode ==  230  || iReplyCode ==  202 ))
                 {
                    CloseSocketConnect(); // 关闭连接
                     throw   new  IOException(strReply.Substring( 4 ));
                }
            }
            bConnected =  true ;

             //  切换到初始目录
             if  (! string .IsNullOrEmpty(strRemotePath))
             {
                ChDir(strRemotePath);
            }
        }


         ///   <summary>
         ///  关闭连接
         ///   </summary>
         public   void  DisConnect()
         {
             if  (socketControl !=  null )
             {
                SendCommand( " QUIT " );
            }
            CloseSocketConnect();
        }

         #endregion

         #region  传输模式

         ///   <summary>
         ///  传输模式:二进制类型、ASCII类型
         ///   </summary>
         public   enum  TransferType
         {
            Binary,
            ASCII
        } ;

         ///   <summary>
         ///  设置传输模式
         ///   </summary>
         ///   <param name="ttType"> 传输模式 </param>
         public   void  SetTransferType(TransferType ttType)
         {
             if  (ttType == TransferType.Binary)
             {
                SendCommand( " TYPE I " ); // binary类型传输
            }
             else
             {
                SendCommand( " TYPE A " ); // ASCII类型传输
            }
             if  (iReplyCode !=  200 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             else
             {
                trType = ttType;
            }
        }


         ///   <summary>
         ///  获得传输模式
         ///   </summary>
         ///   <returns> 传输模式 </returns>
         public  TransferType GetTransferType()
         {
             return  trType;
        }

         #endregion

         #region  文件操作
         ///   <summary>
         ///  获得文件列表
         ///   </summary>
         ///   <param name="strMask"> 文件名的匹配字符串 </param>
         ///   <returns></returns>
         public   string [] Dir( string  strMask)
         {
             //  建立链接
             if  (!bConnected)
             {
                Connect();
            }

             // 建立进行数据连接的socket
            Socket socketData = CreateDataSocket();

             // 传送命令
            SendCommand( " LIST  "  + strMask);

             // 分析应答代码
             if  (!(iReplyCode ==  150  || iReplyCode ==  125  || iReplyCode ==  226 ))
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }

             // 获得结果
            strMsg =  "" ;
             while  ( true )
             {
                 int  iBytes = socketData.Receive(buffer, buffer.Length,  0 );
                strMsg += GB2312.GetString(buffer,  0 , iBytes);
                 if  (iBytes < buffer.Length)
                 {
                     break ;
                }
            }
             char [] seperator =  {  ' \n '  } ;
             string [] strsFileList = strMsg.Split(seperator);
            socketData.Close(); // 数据socket关闭时也会有返回码
             if  (iReplyCode !=  226 )
             {
                ReadReply();
                 if  (iReplyCode !=  226 )
                 {
                     throw   new  IOException(strReply.Substring( 4 ));
                }
            }
             return  strsFileList;
        }


         ///   <summary>
         ///  获取文件大小
         ///   </summary>
         ///   <param name="strFileName"> 文件名 </param>
         ///   <returns> 文件大小 </returns>
         public   long  GetFileSize( string  strFileName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SendCommand( " SIZE  "  + Path.GetFileName(strFileName));
             long  lSize =  0 ;
             if  (iReplyCode ==  213 )
             {
                lSize = Int64.Parse(strReply.Substring( 4 ));
            }
             else
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             return  lSize;
        }


         ///   <summary>
         ///  删除
         ///   </summary>
         ///   <param name="strFileName"> 待删除文件名 </param>
         public   void  Delete( string  strFileName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SendCommand( " DELE  "  + strFileName);
             if  (iReplyCode !=  250 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
        }


         ///   <summary>
         ///  重命名(如果新文件名与已有文件重名,将覆盖已有文件)
         ///   </summary>
         ///   <param name="strOldFileName"> 旧文件名 </param>
         ///   <param name="strNewFileName"> 新文件名 </param>
         public   void  Rename( string  strOldFileName,  string  strNewFileName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SendCommand( " RNFR  "  + strOldFileName);
             if  (iReplyCode !=  350 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             //   如果新文件名与原有文件重名,将覆盖原有文件
            SendCommand( " RNTO  "  + strNewFileName);
             if  (iReplyCode !=  250 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
        }
         #endregion

         #region  上传和下载
         ///   <summary>
         ///  下载一批文件
         ///   </summary>
         ///   <param name="strFileNameMask"> 文件名的匹配字符串 </param>
         ///   <param name="strFolder"> 本地目录(不得以\结束) </param>
         public   void  Get( string  strFileNameMask,  string  strFolder)
         {
             if  (!bConnected)
             {
                Connect();
            }
             string [] strFiles = Dir(strFileNameMask);
             foreach  ( string  strFile  in  strFiles)
             {
                 if  (!strFile.Equals( "" )) // 一般来说strFiles的最后一个元素可能是空字符串
                 {
                     if  (strFile.LastIndexOf( " . " ) > - 1 )
                     {
                        Get(strFile.Replace( " \r " ,  "" ), strFolder, strFile.Replace( " \r " ,  "" ));
                    }
                }
            }
        }


         ///   <summary>
         ///  下载目录
         ///   </summary>
         ///   <param name="strRemoteFileName"> 要下载的文件名 </param>
         ///   <param name="strFolder"> 本地目录(不得以\结束) </param>
         ///   <param name="strLocalFileName"> 保存在本地时的文件名 </param>
         public   void  Get( string  strRemoteFileName,  string  strFolder,  string  strLocalFileName)
         {
             if  (strLocalFileName.StartsWith( " -r " ))
             {
                 string [] infos = strLocalFileName.Split( '   ' );
                strRemoteFileName=strLocalFileName = infos[infos.Length -  1 ];

                 if  (!bConnected)
                 {
                    Connect();
                }
                SetTransferType(TransferType.Binary);
                 if  (strLocalFileName.Equals( "" ))
                 {
                    strLocalFileName = strRemoteFileName;
                }
                 if  (!File.Exists(strLocalFileName))
                 {
                    Stream st = File.Create(strLocalFileName);
                    st.Close();
                }

                FileStream output =  new
                    FileStream(strFolder +  " \\ "  + strLocalFileName, FileMode.Create);
                Socket socketData = CreateDataSocket();
                SendCommand( " RETR  "  + strRemoteFileName);
                 if  (!(iReplyCode ==  150  || iReplyCode ==  125
                || iReplyCode ==  226  || iReplyCode ==  250 ))
                 {
                     throw   new  IOException(strReply.Substring( 4 ));
                }
                 while  ( true )
                 {
                     int  iBytes = socketData.Receive(buffer, buffer.Length,  0 );
                    output.Write(buffer,  0 , iBytes);
                     if  (iBytes <=  0 )
                     {
                         break ;
                    }
                }
                output.Close();
                 if  (socketData.Connected)
                 {
                    socketData.Close();
                }
                 if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
                 {
                    ReadReply();
                     if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
                     {
                         throw   new  IOException(strReply.Substring( 4 ));
                    }
                }
            }
        }

         ///   <summary>
         ///  下载一个文件
         ///   </summary>
         ///   <param name="strRemoteFileName"> 要下载的文件名 </param>
         ///   <param name="strFolder"> 本地目录(不得以\结束) </param>
         ///   <param name="strLocalFileName"> 保存在本地时的文件名 </param>
         public   void  GetFile( string  strRemoteFileName,  string  strFolder,  string  strLocalFileName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SetTransferType(TransferType.Binary);
             if  (strLocalFileName.Equals( "" ))
             {
                strLocalFileName = strRemoteFileName;
            }
             if  (!File.Exists(strLocalFileName))
             {
                Stream st = File.Create(strLocalFileName);
                st.Close();
            }

            FileStream output =  new
                FileStream(strFolder +  " \\ "  + strLocalFileName, FileMode.Create);
            Socket socketData = CreateDataSocket();
            SendCommand( " RETR  "  + strRemoteFileName);
             if  (!(iReplyCode ==  150  || iReplyCode ==  125
            || iReplyCode ==  226  || iReplyCode ==  250 ))
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             while  ( true )
             {
                 int  iBytes = socketData.Receive(buffer, buffer.Length,  0 );
                output.Write(buffer,  0 , iBytes);
                 if  (iBytes <=  0 )
                 {
                     break ;
                }
            }
            output.Close();
             if  (socketData.Connected)
             {
                socketData.Close();
            }
             if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
             {
                ReadReply();
                 if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
                 {
                     throw   new  IOException(strReply.Substring( 4 ));
                }
            }
        }

         ///   <summary>
         ///  下载一个文件
         ///   </summary>
         ///   <param name="strRemoteFileName"> 要下载的文件名 </param>
         ///   <param name="strFolder"> 本地目录(不得以\结束) </param>
         ///   <param name="strLocalFileName"> 保存在本地时的文件名 </param>
         public   void  GetBrokenFile( string  strRemoteFileName,  string  strFolder,  string  strLocalFileName, long  size)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SetTransferType(TransferType.Binary);

            

            FileStream output =  new
                FileStream(strFolder +  " \\ "  + strLocalFileName, FileMode.Append);
            Socket socketData = CreateDataSocket();
            SendCommand( " REST  "  + size.ToString());
            SendCommand( " RETR  "  + strRemoteFileName);
             if  (!(iReplyCode ==  150  || iReplyCode ==  125
            || iReplyCode ==  226  || iReplyCode ==  250 ))
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }

             // int byteYu = (int)size % 512;
             // int byteChu = (int)size / 512;
             // byte[] tempBuffer = new byte[byteYu];
             // for (int i = 0; i < byteChu; i++)
             // {
             //     socketData.Receive(buffer, buffer.Length, 0);
             // }
    
             // socketData.Receive(tempBuffer, tempBuffer.Length, 0);

             // socketData.Receive(buffer, byteYu, 0);
             while  ( true )
             {
                 int  iBytes = socketData.Receive(buffer, buffer.Length,  0 );
                 // totalBytes += iBytes;
                
                output.Write(buffer,  0 , iBytes);
                 if  (iBytes <=  0 )
                 {
                     break ;
                }
            }
            output.Close();
             if  (socketData.Connected)
             {
                socketData.Close();
            }
             if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
             {
                ReadReply();
                 if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
                 {
                     throw   new  IOException(strReply.Substring( 4 ));
                }
            }
        }



         ///   <summary>
         ///  上传一批文件
         ///   </summary>
         ///   <param name="strFolder"> 本地目录(不得以\结束) </param>
         ///   <param name="strFileNameMask"> 文件名匹配字符(可以包含*和?) </param>
         public   void  Put( string  strFolder,  string  strFileNameMask)
         {
             string [] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
             foreach  ( string  strFile  in  strFiles)
             {
                 // strFile是完整的文件名(包含路径)
                Put(strFile);
            }
        }


         ///   <summary>
         ///  上传一个文件
         ///   </summary>
         ///   <param name="strFileName"> 本地文件名 </param>
         public   void  Put( string  strFileName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            Socket socketData = CreateDataSocket();
            SendCommand( " STOR  "  + Path.GetFileName(strFileName));
             if  (!(iReplyCode ==  125  || iReplyCode ==  150 ))
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
            FileStream input =  new
            FileStream(strFileName, FileMode.Open);
             int  iBytes =  0 ;
             while  ((iBytes = input.Read(buffer,  0 , buffer.Length)) >  0 )
             {
                socketData.Send(buffer, iBytes,  0 );
            }
            input.Close();
             if  (socketData.Connected)
             {
                socketData.Close();
            }
             if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
             {
                ReadReply();
                 if  (!(iReplyCode ==  226  || iReplyCode ==  250 ))
                 {
                     throw   new  IOException(strReply.Substring( 4 ));
                }
            }
        }

         #endregion

         #region  目录操作
         ///   <summary>
         ///  创建目录
         ///   </summary>
         ///   <param name="strDirName"> 目录名 </param>
         public   void  MkDir( string  strDirName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SendCommand( " MKD  "  + strDirName);
             if  (iReplyCode !=  257 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
        }


         ///   <summary>
         ///  删除目录
         ///   </summary>
         ///   <param name="strDirName"> 目录名 </param>
         public   void  RmDir( string  strDirName)
         {
             if  (!bConnected)
             {
                Connect();
            }
            SendCommand( " RMD  "  + strDirName);
             if  (iReplyCode !=  250 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
        }


         ///   <summary>
         ///  改变目录
         ///   </summary>
         ///   <param name="strDirName"> 新的工作目录名 </param>
         public   void  ChDir( string  strDirName)
         {
             if  (strDirName.Equals( " . " ) || strDirName.Equals( "" ))
             {
                 return ;
            }
             if  (!bConnected)
             {
                Connect();
            }
            SendCommand( " CWD  "  + strDirName);
             if  (iReplyCode !=  250 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             this .strRemotePath = strDirName;
        }

         #endregion

         #region  内部变量
         ///   <summary>
         ///  服务器返回的应答信息(包含应答码)
         ///   </summary>
         private   string  strMsg;
         ///   <summary>
         ///  服务器返回的应答信息(包含应答码)
         ///   </summary>
         private   string  strReply;
         ///   <summary>
         ///  服务器返回的应答码
         ///   </summary>
         private   int  iReplyCode;
         ///   <summary>
         ///  进行控制连接的socket
         ///   </summary>
         private  Socket socketControl;
         ///   <summary>
         ///  传输模式
         ///   </summary>
         private  TransferType trType;
         ///   <summary>
         ///  接收和发送数据的缓冲区
         ///   </summary>
         private   static   int  BLOCK_SIZE =  512 ;
        Byte[] buffer =  new  Byte[BLOCK_SIZE];
         ///   <summary>
         ///  编码方式(为防止出现中文乱码采用 GB2312编码方式)
         ///   </summary>
        Encoding GB2312 = Encoding.GetEncoding( " gb2312 " );
         #endregion

         #region  内部函数
         ///   <summary>
         ///  将一行应答字符串记录在strReply和strMsg
         ///  应答码记录在iReplyCode
         ///   </summary>
         private   void  ReadReply()
         {
            strMsg =  "" ;
            strReply = ReadLine();
            iReplyCode = Int32.Parse(strReply.Substring( 0 ,  3 ));
        }

         ///   <summary>
         ///  建立进行数据连接的socket
         ///   </summary>
         ///   <returns> 数据连接socket </returns>
         private  Socket CreateDataSocket()
         {
            SendCommand( " PASV " );
             if  (iReplyCode !=  227 )
             {
                 throw   new  IOException(strReply.Substring( 4 ));
            }
             int  index1 = strReply.IndexOf( ' ( ' );
             int  index2 = strReply.IndexOf( ' ) ' );
             string  ipData =
            strReply.Substring(index1 +  1 , index2 - index1 -  1 );
             int [] parts =  new   int [ 6 ];
             int  len = ipData.Length;
             int  partCount =  0 ;
             string  buf =  "" ;
             for  ( int  i =  0 ; i < len && partCount <=  6 ; i++)
             {
                 char  ch = Char.Parse(ipData.Substring(i,  1 ));
                 if  (Char.IsDigit(ch))
                    buf += ch;
                 else   if  (ch !=  ' , ' )
                 {
                     throw   new  IOException( " Malformed PASV strReply:  "  +
                    strReply);
                }
                 if  (ch ==  ' , '  || i +  1  == len)
                 {
                     try
                     {
                        parts[partCount++] = Int32.Parse(buf);
                        buf =  "" ;
                    }
                     catch  (Exception)
                     {
                         throw   new  IOException( " Malformed PASV strReply:  "  +
                         strReply);
                    }
                }
            }
             string  ipAddress = parts[ 0 ] +  " . "  + parts[ 1 ] +  " . "  +
            parts[ 2 ] +  " . "  + parts[ 3 ];
             int  port = (parts[ 4 ] <<  8 ) + parts[ 5 ];
            Socket s =  new
            Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ep =  new
            IPEndPoint(IPAddress.Parse(ipAddress), port);
             try
             {
                s.Connect(ep);
            }
             catch  (Exception)
             {
                 throw   new  IOException( " Can't connect to remote server " );
            }
             return  s;
        }


         ///   <summary>
         ///  关闭socket连接(用于登录以前)
         ///   </summary>
         private   void  CloseSocketConnect()
         {
             if  (socketControl !=  null )
             {
                socketControl.Close();
                socketControl =  null ;
            }
            bConnected =  false ;
        }

         ///   <summary>
         ///  读取Socket返回的所有字符串
         ///   </summary>
         ///   <returns> 包含应答码的字符串行 </returns>
         private   string  ReadLine()
         {
             while  ( true )
             {
                 int  iBytes = socketControl.Receive(buffer, buffer.Length,  0 );
                strMsg += GB2312.GetString(buffer,  0 , iBytes);
                 if  (iBytes < buffer.Length)
                 {
                     break ;
                }
            }
             char [] seperator =  {  ' \n '  } ;
             string [] mess = strMsg.Split(seperator);
             if  (strMsg.Length >  2 )
             {
                strMsg = mess[mess.Length -  2 ];
                 // seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
                 // 但也会分配为空字符串给后面(也是最后一个)字符串数组,
                 // 所以最后一个mess是没用的空字符串
                 // 但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
            }
             else
             {
                strMsg = mess[ 0 ];
            }
             if  (!strMsg.Substring( 3 ,  1 ).Equals( "   " )) // 返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
             {
                 return  ReadLine();
            }
             return  strMsg;
        }


         ///   <summary>
         ///  发送命令并获取应答码和最后一行应答字符串
         ///   </summary>
         ///   <param name="strCommand"> 命令 </param>
         private   void  SendCommand(String strCommand)
         {
            Byte[] cmdBytes =
            GB2312.GetBytes((strCommand +  " \r\n " ).ToCharArray());
            socketControl.Send(cmdBytes, cmdBytes.Length,  0 );
            ReadReply();
        }

         #endregion
    }
}



当然,大家还要看看Main方法

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  ftpGet
{
     class  Program
     {
         static   string  remotingFolder = System.Configuration.ConfigurationSettings.AppSettings[ " remotingFolder " ];   // 远程ftp文件目录
         static   string  localFolder = System.Configuration.ConfigurationSettings.AppSettings[ " localFolder " ];   // 要下载到的本地目录
         static   string  ftpServer = System.Configuration.ConfigurationSettings.AppSettings[ " ftpServer " ];   // ftp服务器
         static   string  user = System.Configuration.ConfigurationSettings.AppSettings[ " user " ];   // 用户名
         static   string  pwd = System.Configuration.ConfigurationSettings.AppSettings[ " pwd " ];   // 密码
         static   string  port = System.Configuration.ConfigurationSettings.AppSettings[ " port " ];   // 端口
         static   void  Main( string [] args)
         {
            FTPClient client =  new  FTPClient(ftpServer,  " / " , user, pwd,  int .Parse(port));
            client.Connect();
            GetFolder( " * " , remotingFolder, client, CreateFolder());
            client.DisConnect();
            ClearFolder();
            Console.WriteLine( " 下载完毕 " );
            System.Threading.Thread.Sleep( 3000 );
        }

         ///   <summary>
         ///  在本地目录下创建一个以日期为名称的目录,我做这个ftp的主要目的是为了每天都备份
         ///   </summary>
         ///   <returns> 创建的目录名 </returns>
         private   static   string  CreateFolder()
         {
             string  folder=localFolder +  " \\ " +DateTime.Now.ToShortDateString();
             if  (!Directory.Exists(folder))
                Directory.CreateDirectory(folder);
            
             return  folder;
        }

         ///   <summary>
         ///  在下载结束后清空程序目录的多余文件
         ///   </summary>
         private   static   void  ClearFolder()
         {
             string  folder = Environment.CurrentDirectory;
             string [] dictorys = Directory.GetFiles(folder);
             foreach  ( string  dictory  in  dictorys)
             {
                FileInfo info =  new  FileInfo(dictory);
                 if  (info.Length ==  0 )
                    File.Delete(dictory);
            }
        }

         ///   <summary>
         ///  递归获取ftp文件夹的内容
         ///   </summary>
         ///   <param name="fileMark"> 文件标记 </param>
         ///   <param name="path"> 远程路径 </param>
         ///   <param name="client"></param>
         ///   <param name="folder"></param>
         private   static   void  GetFolder( string  fileMark,  string  path, FTPClient client,  string  folder)
         {
             string [] dirs = client.Dir(path);   // 获取目录下的内容
            client.ChDir(path);   // 改变目录
             foreach  ( string  dir  in  dirs)
             {
                 string [] infos = dir.Split( '   ' );
                 string  info = infos[infos.Length -  1 ].Replace( " \r " ,  "" );
                 if  (dir.StartsWith( " d " ) && ! string .IsNullOrEmpty(dir))   // 为目录
                 {

                     if  (!info.EndsWith( " . " ) && !info.EndsWith( " .. " ))   // 筛选出真实的目录
                     {
                        Directory.CreateDirectory(folder +  " \\ "  + info);
                        GetFolder(fileMark, path +  " / "  + info, client, folder +  " \\ "  + info);
                        client.ChDir(path);
                    }
                }
                 else   if  (dir.StartsWith( " -r " ))   // 为文件
                 {
                     string  file = folder +  " \\ "  + info;
                     if  (File.Exists(file))  
                     {
                         long  remotingSize = client.GetFileSize(info);
                        FileInfo fileInfo =  new  FileInfo(file);
                         long  localSize = fileInfo.Length;

                         if  (remotingSize != localSize)   // 短点续传
                         {
                            client.GetBrokenFile(info, folder, info, localSize);
                        }
                    }
                     else
                     {
                        client.GetFile(info, folder, info);   // 下载文件
                        Console.WriteLine( " 文件 "  + folder + info +  " 已经下载 " );
                    }
                }
            }

        }
    }
}


配置文件

<? xml version="1.0" encoding="utf-8"  ?>
< configuration >
   < appSettings >
     < add  key ="remotingFolder"  value ="/temp" />
     < add  key ="localFolder"  value ="c:\temp" />
     < add  key ="ftpServer"  value ="*" />
     < add  key ="user"  value ="*" />
     < add  key ="pwd"  value ="*" />
     < add  key ="port"  value ="21" />
   </ appSettings >
</ configuration >


作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于c#上传下载ftp(支持断点续传)的详细内容...

  阅读:55次