zoukankan      html  css  js  c++  java
  • FTP通讯封装 上海

    一天,一时,一分,一秒,最近时间的概念离我越来越远,也许是工作太充实了,或许是自己真的老了!
       前两天编写 有关FTP 的东西,感觉还行。
         
    //===============================================
    //        Data:2008
    //===============================================
    using System;
    using System.Configuration;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;

    namespace WindowsApplication3
    {
       public class FtpHelper
        {
          #region 成员变量

            //static readonly log4net.ILog log = log4net.LogManager.GetLogger("log4net");
            private string remoteHost, remotePath, remoteUser, remotePass, mes;
            private int remotePort = 21, bytes;
            private Socket clientSocket;
            private int retValue;
            private Boolean debug;
            private Boolean logined;
            private string reply;

            private static int BLOCK_SIZE = 512;
            private Byte[] buffer = new Byte[BLOCK_SIZE];
            private Encoding ASCII = Encoding.ASCII;
            // FTP当前处理信息事件
           public delegate void FTPProcessInfoEventHandler(string msg);
            public event FTPProcessInfoEventHandler SetProcessInfoEvent;
            #endregion

            #region 构造方法

            public FtpHelper()
            {
                //string FTPRemoteIP = ConfigurationSettings.AppSettings["FTPRemoteIP"];
                //int FTPRemotePort = Convert.ToInt32(ConfigurationSettings.AppSettings["FTPRemotePort"]);
                //string FTPUser = ConfigurationSettings.AppSettings["FTPUser"];
                //string FTPPassword = ConfigurationSettings.AppSettings["FTPPassword"];

                //remoteHost = FTPRemoteIP;
                remotePath = ".";
                //remoteUser = FTPUser;
                //remotePass = FTPPassword;
                //remotePort = FTPRemotePort;

                debug = false;
                logined = false;
            }

            #endregion

           #region 基本信息设置

            /**////
            /// Set the name of the FTP server to connect to.
            ///
            /// Server name
            public void setRemoteHost(string remoteHost)
            {
                this.remoteHost = remoteHost;
            }

            /**////
            /// Return the name of the current FTP server.
            ///
            /// Server name
            public string getRemoteHost()
            {
                return remoteHost;
            }

            /**////
            /// Set the port number to use for FTP.
            ///
            /// Port number
            public void setRemotePort(int remotePort)
            {
                this.remotePort = remotePort;
            }

            /**////
            /// Return the current port number.
            ///
            /// Current port number
            public int getRemotePort()
            {
                return remotePort;
            }

            /**////
            /// Set the remote directory path.
            ///
            /// The remote directory path
            public void setRemotePath(string remotePath)
            {
                this.remotePath = remotePath;
            }

            /**////
            /// Return the current remote directory path.
            ///
            /// The current remote directory path.
            public string getRemotePath()
            {
                return remotePath;
            }

            /**////
            /// Set the user name to use for logging into the remote server.
            ///
            /// Username
            public void setRemoteUser(string remoteUser)
            {
                this.remoteUser = remoteUser;
            }

            /**////
            /// Set the password to user for logging into the remote server.
            ///
            /// Password
            public void setRemotePass(string remotePass)
            {
                this.remotePass = remotePass;
            }

            #endregion

           #region 属性
            /**//// <summary>
            /// 是否登录成功
            /// </summary>
            public bool GetLogin
            {
                get
                {
                    return this.logined;
                }
            }

            #endregion

            #region 功能操作

            /**////
            /// Return a string array containing the remote directory's file list.
            ///
            ///
            ///
            public string[] getFileList(string mask)
            {
                if (!logined)
                {
                    login();
                }

                Socket cSocket = createDataSocket();

                sendCommand("NLST " + mask);

                if (!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }

                mes = "";
                Thread.Sleep(700);

                while (true)
                {
                    if (cSocket.Connected)
                    {
                        int bytes = cSocket.Receive(buffer, buffer.Length, 0);
                        mes += ASCII.GetString(buffer, 0, bytes);
                        if (bytes < buffer.Length)
                        {
                            break;
                        }
                    }
                    else
                    {
                        this.SetProcessInfoText("socket 连接已断!");
                        //log.Info("socket 连接断了!");
                    }

                }
                //log.Info(mes);
                char[] seperator = { '\n' };
                string[] mess = mes.Split(seperator);
                //foreach(string fileName in mess)
                //{
                //log.Info(fileName);
                //}

                cSocket.Close();
                readReply();

                if (retValue != 226)
                {
                    throw new IOException(reply.Substring(4));
                }
                return mess;
            }

            public string[] getFileList()
            {
                if (!logined)
                {
                    login();
                }

                Socket cSocket = createDataSocket();

                sendCommand("LIST ");

                if (!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }

                mes = "";

                while (true)
                {
                    int bytes = cSocket.Receive(buffer, buffer.Length, 0);
                    mes += ASCII.GetString(buffer, 0, bytes);

                    if (bytes < buffer.Length)
                    {
                        break;
                    }
                }

                //log.Info(mes);
                char[] seperator = { '\n' };
                string[] mess = mes.Split(seperator);
                cSocket.Close();

                readReply();

                if (retValue != 226)
                {
                    throw new IOException(reply.Substring(4));
                }

                return mess;
            }

            /**////
            /// Return the size of a file.
            ///
            ///
            ///
            public long getFileSize(string fileName)
            {
                if (!logined)
                {
                    login();
                }

                sendCommand("SIZE " + fileName);

                long size = 0;

                if (retValue == 213)
                {
                    size = Int64.Parse(reply.Substring(4));
                }
                else
                {
                    throw new IOException(reply.Substring(4));
                }

                return size;
            }

            /**////
            /// Login to the remote server.
            ///
            public void login()
            {
                this.SetProcessInfoText("连接中");

                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                IPEndPoint ep = new IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);

                try
                {
                    clientSocket.Connect(ep);
                }
                catch (Exception)
                {
                    this.SetProcessInfoText("连接失败!");
                    // throw new IOException("Couldn't connect to remote server");
                }

                try
                {
                    readReply();

                    if (retValue != 220)
                    {
                        close();
                        // throw new IOException(reply.Substring(4));
                    }

                    if (debug)
                        Console.WriteLine("USER " + remoteUser);

                    this.SetProcessInfoText("检测用户名!");
                    sendCommand("USER " + remoteUser);

                    if (!(retValue == 331 || retValue == 230))
                    {
                        this.SetProcessInfoText("检测用户名失败!");
                        cleanup();
                        // throw new IOException(reply.Substring(4));
                    }

                    if (retValue != 230)
                    {
                        if (debug)
                            Console.WriteLine("PASS xxx");

                        this.SetProcessInfoText("检测用户密码!");
                        sendCommand("PASS " + remotePass);

                        if (!(retValue == 230 || retValue == 202))
                        {
                            this.SetProcessInfoText("检测用户密码失败!");
                            cleanup();
                            // throw new IOException(reply.Substring(4));
                        }
                    }

                    logined = true;
                    // Console.WriteLine("Connected to " + remoteHost);
                    this.SetProcessInfoText("连接成功!");

                    chdir(remotePath);
                }
                catch (Exception)
                {
                    this.SetProcessInfoText("连接失败!");
                    // throw new IOException("Couldn't connect to remote server");
                }
            }

            /**////
            /// If the value of mode is true, set binary mode for   downloads.
            /// Else, set Ascii mode.
            ///
            ///
            public void setBinaryMode(Boolean mode)
            {
                if (mode)
                {
                    sendCommand("TYPE I");
                }
                else
                {
                    sendCommand("TYPE A");
                }
                if (retValue != 200)
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Download a file to the Assembly's local directory,
            /// keeping the same file name.
            ///
            ///
            public void download(string remFileName)
            {
                download(remFileName, "", false);
            }

            /**////
            /// Download a remote file to the Assembly's local directory,
            /// keeping the same file name, and set the resume flag.
            ///
            ///
            ///
            public void download(string remFileName, Boolean resume)
            {
                download(remFileName, "", resume);
            }

            /**////
            /// Download a remote file to a local file name which can   include
            /// a path. The local file name will be created or overwritten,
            /// but the path must exist.
            ///
            ///
            ///
            public void download(string remFileName, string locFileName)
            {
                download(remFileName, locFileName, false);
            }

            /**////
            /// Download a remote file to a local file name which can include
            /// a path, and set the resume flag. The local file name will be
            /// created or overwritten, but the path must exist.
            ///
            ///
            ///
            ///
            public void download(string remFileName, string locFileName, Boolean resume)
            {
                if (!logined)
                {
                    login();
                }
                setBinaryMode(false);

                Console.WriteLine("Downloading file " + remFileName + " from " + remoteHost + "//" + remotePath);

                if (locFileName.Equals(""))
                {
                    locFileName = remFileName;
                }

                if (!File.Exists(locFileName))
                {
                    Stream st = File.Create(locFileName);
                    st.Close();
                }

                FileStream output = new FileStream(locFileName, FileMode.Create);
                Socket cSocket = createDataSocket();
                long offset = 0;

                if (resume)
                {
                    offset = output.Length;
                    if (offset > 0)
                    {
                        setBinaryMode(false);
                        sendCommand("REST " + offset);
                        if (retValue != 350)
                        {
                            //throw new IOException(reply.Substring(4));
                            //Some servers may not support resuming.
                            offset = 0;
                        }
                    }

                    if (offset > 0)
                    {
                        if (debug)
                        {
                            Console.WriteLine("seeking to " + offset);
                        }
                        long npos = output.Seek(offset, SeekOrigin.Begin);
                        Console.WriteLine("new pos=" + npos);
                    }
                }

                sendCommand("RETR " + remFileName);

                if (!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }


                while (true)
                {
                    bytes = cSocket.Receive(buffer, buffer.Length, 0);
                    output.Write(buffer, 0, bytes);

                    if (bytes <= 0)
                    {
                        break;
                    }
                }

                output.Close();

                if (cSocket.Connected)
                {
                    cSocket.Close();
                }

                Console.WriteLine("");
                readReply();

                if (!(retValue == 226 || retValue == 250))
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Upload a file.
            ///
            ///
            public void upload(string fileName)
            {
                upload(fileName, false);
            }

            /**////
            /// Upload a file and set the resume flag.
            ///
            ///
            ///
            public void upload(string fileName, Boolean resume)
            {
                if (!logined)
                {
                    login();
                }
                Socket cSocket = createDataSocket();
                long offset = 0;

                if (resume)
                {
                    try
                    {
                        setBinaryMode(true);
                        offset = getFileSize(fileName);
                    }
                    catch (Exception)
                    {
                        offset = 0;
                    }
                }

                if (offset > 0)
                {
                    sendCommand("REST " + offset);
                    if (retValue != 350)
                    {
                        //throw new IOException(reply.Substring(4));
                        //Remote server may not support resuming.
                        offset = 0;
                    }
                }

                /**//*==========================*/
                sendCommand("STOR " + Path.GetFileName(fileName));
                if (!(retValue == 125 || retValue == 150))
                {
                    throw new IOException(reply.Substring(4));
                }

                // open input stream to read source file
                FileStream input = new FileStream(fileName, FileMode.Open);

                if (offset != 0)
                {
                    if (debug)
                    {
                        Console.WriteLine("seeking to " + offset);
                    }
                    input.Seek(offset, SeekOrigin.Begin);
                }

                Console.WriteLine("Uploading file " + fileName + " to " + remotePath);

                while ((bytes = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    cSocket.Send(buffer, bytes, 0);
                }

                input.Close();
                Console.WriteLine("");

                if (cSocket.Connected)
                {
                    cSocket.Close();
                }

                readReply();
                if (!(retValue == 226 || retValue == 250))
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Delete a file from the remote FTP server.
            ///
            ///
            public void deleteRemoteFile(string fileName)
            {
                if (!logined)
                {
                    login();
                }
                sendCommand("DELE " + fileName);

                if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Rename a file on the remote FTP server.
            ///
            ///
            ///
            public void renameRemoteFile(string oldFileName, string newFileName)
            {
                if (!logined)
                {
                    login();
                }
                sendCommand("RNFR " + oldFileName);

                if (retValue != 350)
                {
                    throw new IOException(reply.Substring(4));
                }
                // known problem
                // rnto will not take care of existing file.
                // i.e. It will overwrite if newFileName exist
                sendCommand("RNTO " + newFileName);

                if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Create a directory on the remote FTP server.
            ///
            ///
            public void mkdir(string dirName)
            {
                if (!logined)
                {
                    login();
                }
                sendCommand("MKD " + dirName);

                if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Delete a directory on the remote FTP server.
            ///
            ///
            public void rmdir(string dirName)
            {
                if (!logined)
                {
                    login();
                }

                sendCommand("RMD " + dirName);

                if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }
            }

            /**////
            /// Change the current working directory on the remote FTP   server.
            ///
            ///
            public void chdir(string dirName)
            {
                if (dirName.Equals("."))
                {
                    return;
                }
                if (!logined)
                {
                    login();
                }
                sendCommand("CWD " + dirName);

                if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }

                this.remotePath = dirName;
                Console.WriteLine("Current directory is " + remotePath);
            }

            /**////
            /// Close the FTP connection.
            ///
            public void close()
            {
                if (clientSocket != null)
                {
                    sendCommand("QUIT");
                }
                cleanup();
                Console.WriteLine("Closing");
            }

            /**////
            /// Set debug mode.
            ///
            ///
            public void setDebug(Boolean debug)
            {
                this.debug = debug;
            }

            private void readReply()
            {
                mes = "";
                reply = readLine();
                retValue = Int32.Parse(reply.Substring(0, 3));
            }

            private void cleanup()
            {
                if (clientSocket != null)
                {
                    clientSocket.Close();
                    clientSocket = null;
                }
                logined = false;
            }

            private string readLine()
            {
                while (true)
                {
                    bytes = clientSocket.Receive(buffer, buffer.Length, 0);
                    mes += ASCII.GetString(buffer, 0, bytes);
                    if (bytes < buffer.Length)
                    {
                        break;
                    }
                }

                char[] seperator = { '\n' };
                string[] mess = mes.Split(seperator);
                if (mes.Length > 2)
                {
                    mes = mess[mess.Length - 2];
                }
                else
                {
                    mes = mess[0];
                }

                if (!mes.Substring(3, 1).Equals(" "))
                {
                    return readLine();
                }

                if (debug)
                {
                    for (int k = 0; k < mess.Length - 1; k++)
                    {
                        Console.WriteLine(mess[k]);
                    }
                }
                return mes;
            }

            private void sendCommand(String command)
            {
                Byte[] cmdBytes = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());
                clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
                readReply();
            }

            private Socket createDataSocket()
            {
                sendCommand("PASV");
                if (retValue != 227)
                {
                    throw new IOException(reply.Substring(4));
                }

                int index1 = reply.IndexOf('(');
                int index2 = reply.IndexOf(')');
                string ipData = reply.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 reply: " + reply);
                    }
                    if (ch == ',' || i + 1 == len)
                    {
                        try
                        {
                            parts[partCount++] = Int32.Parse(buf);
                            buf = "";
                        }
                        catch (Exception)
                        {
                            throw new IOException("Malformed PASV reply: " + reply);
                        }
                    }
                }

                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);
                s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 5000);

                IPEndPoint ep = new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port);

                try
                {
                    s.Connect(ep);
                }
                catch (Exception)
                {
                    throw new IOException("Can't connect to remote   server");
                }
                return s;
            }

            #endregion

           #region 信息输出方法

            private void SetProcessInfoText(string str)
            {
                try
                {
                    if (this.SetProcessInfoEvent != null)
                    {
                        this.SetProcessInfoEvent(str);
                    }
                }
                catch (Exception err)
                {
                    throw (err);
                }
            }

            #endregion
        }

    }

  • 相关阅读:
    python list dict 去重的两种方式
    python 发送邮件
    mongo 查询总结
    vsftpd 安装配置
    简单配置 nginx 反向代理
    python 检查内存
    python ldap
    Centos 7 vsftpd ldap 配置
    centos7虚拟机开启端口后 外部不能访问的问题
    Linux下安装配置rocketmq (单个Master、双Master)
  • 原文地址:https://www.cnblogs.com/luozhai714/p/1076450.html
Copyright © 2011-2022 走看看