C# 的FTP源代码(二)

举报
竹叶青 发表于 2019/09/05 18:38:47 2019/09/05
【摘要】 private void CloseDataSocket() { if (data_sock != null) { if (data_sock.Connected) { data_sock.Close(); ...

private void CloseDataSocket()

        {

            if (data_sock != null)

            {

                if (data_sock.Connected)

                {

                    data_sock.Close();

                }

                data_sock = null;

            }

            data_ipEndPoint = null;

        }

        /// <summary>

        /// 关闭所有链接

        /// </summary>

        public void Disconnect()

        {

            CloseDataSocket();

            if (main_sock != null)

            {

                if (main_sock.Connected)

                {

                    SendCommand("QUIT");

                    main_sock.Close();

                }

                main_sock = null;

            }

            if (file != null)

                file.Close();

            main_ipEndPoint = null;

            file = null;

        }

        /// <summary>

        /// 链接到FTP服务器

        /// </summary>

        /// <param name="server">要链接的IP地址或主机名</param>

        /// <param name="port">端口号</param>

        /// <param name="user">登陆帐号</param>

        /// <param name="pass">登陆口令</param>

        public void Connect(string server, int port, string user, string pass)

        {

            this.server = server;

            this.user = user;

            this.pass = pass;

            this.port = port;

            Connect();

        }

        /// <summary>

        /// 链接到FTP服务器

        /// </summary>

        /// <param name="server">要链接的IP地址或主机名</param>

        /// <param name="user">登陆帐号</param>

        /// <param name="pass">登陆口令</param>

        public void Connect(string server, string user, string pass)

        {

            this.server = server;

            this.user = user;

            this.pass = pass;

            Connect();

        }

        /// <summary>

        /// 链接到FTP服务器

        /// </summary>

        public bool Connect()

        {

            if (server == null)

            {

                errormessage += "No server has been set.\r\n";

            }

            if (user == null)

            {

                errormessage += "No server has been set.\r\n";

            }

            if (main_sock != null)

                if (main_sock.Connected)

                    return true;

            try

            {

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

                //#if NET1

                main_ipEndPoint = new IPEndPoint(Dns.GetHostByName(server).AddressList[0], port);

                //#else

                //              main_ipEndPoint = new IPEndPoint(System.Net.Dns.GetHostEntry(server).AddressList[0], port);

                //#endif

                main_sock.Connect(main_ipEndPoint);

            }

            catch (Exception ex)

            {

                errormessage += ex.Message;

                return false;

            }

            ReadResponse();

            if (response != 220)

                Fail();

            SendCommand("USER " + user);

            ReadResponse();

            switch (response)

            {

                case 331:

                    if (pass == null)

                    {

                        Disconnect();

                        errormessage += "No password has been set.";

                        return false;

                    }

                    SendCommand("PASS " + pass);

                    ReadResponse();

                    if (response != 230)

                    {

                        Fail();

                        return false;

                    }

                    break;

                case 230:

                    break;

            }

            return true;

        }

        /// <summary>

        /// 获取FTP当前(工作)目录下的文件列表

        /// </summary>

        /// <returns>返回文件列表数组</returns>

        public ArrayList List()

        {

            Byte[] bytes = new Byte[512];

            string file_list = "";

            long bytesgot = 0;

            int msecs_passed = 0;

            ArrayList list = new ArrayList();

            Connect();

            OpenDataSocket();

            SendCommand("LIST");

            ReadResponse();

            switch (response)

            {

                case 125:

                case 150:

                    break;

                default:

                    CloseDataSocket();

                    throw new Exception(responseStr);

            }

            ConnectDataSocket();

            while (data_sock.Available < 1)

            {

                System.Threading.Thread.Sleep(50);

                msecs_passed += 50;

                if (msecs_passed > (timeout / 10))

                {

                    break;

                }

            }

            while (data_sock.Available > 0)

            {

                bytesgot = data_sock.Receive(bytes, bytes.Length, 0);

                file_list += Encoding.ASCII.GetString(bytes, 0, (int)bytesgot);

                System.Threading.Thread.Sleep(50);

            }

            CloseDataSocket();

            ReadResponse();

            if (response != 226)

                throw new Exception(responseStr);

            foreach (string f in file_list.Split('\n'))

            {

                if (f.Length > 0 && !Regex.Match(f, "^total").Success)

                    list.Add(f.Substring(0, f.Length - 1));

            }

            return list;

        }

        /// <summary>

        /// 获取到文件名列表

        /// </summary>

        /// <returns>返回文件名列表</returns>

        public ArrayList ListFiles()

        {

            ArrayList list = new ArrayList();

            foreach (string f in List())

            {

                if ((f.Length > 0))

                {

                    if ((f[0] != 'd') && (f.ToUpper().IndexOf("<DIR>") < 0))

                        list.Add(f);

                }

            }

            return list;

        }

        /// <summary>

        /// 获取路径列表

        /// </summary>

        /// <returns>返回路径列表</returns>

        public ArrayList ListDirectories()

        {

            ArrayList list = new ArrayList();

            foreach (string f in List())

            {

                if (f.Length > 0)

                {

                    if ((f[0] == 'd') || (f.ToUpper().IndexOf("<DIR>") >= 0))

                        list.Add(f);

                }

            }

            return list;

        }

        /// <summary>

        /// 获取原始数据信息.

        /// </summary>

        /// <param name="fileName">远程文件名</param>

        /// <returns>返回原始数据信息.</returns>

        public string GetFileDateRaw(string fileName)

        {

            Connect();

            SendCommand("MDTM " + fileName);

            ReadResponse();

            if (response != 213)

            {

                errormessage += responseStr;

                return "";

            }

            return (this.responseStr.Substring(4));

        }

        /// <summary>

        /// 得到文件日期.

        /// </summary>

        /// <param name="fileName">远程文件名</param>

        /// <returns>返回远程文件日期</returns>

        public DateTime GetFileDate(string fileName)

        {

            return ConvertFTPDateToDateTime(GetFileDateRaw(fileName));

        }

        private DateTime ConvertFTPDateToDateTime(string input)

        {

            if (input.Length < 14)

                throw new ArgumentException("Input Value for ConvertFTPDateToDateTime method was too short.");

            //YYYYMMDDhhmmss":

            int year = Convert.ToInt16(input.Substring(0, 4));

            int month = Convert.ToInt16(input.Substring(4, 2));

            int day = Convert.ToInt16(input.Substring(6, 2));

            int hour = Convert.ToInt16(input.Substring(8, 2));

            int min = Convert.ToInt16(input.Substring(10, 2));

            int sec = Convert.ToInt16(input.Substring(12, 2));

            return new DateTime(year, month, day, hour, min, sec);

        }

        /// <summary>

        /// 获取FTP上的当前(工作)路径

        /// </summary>

        /// <returns>返回FTP上的当前(工作)路径</returns>

        public string GetWorkingDirectory()

        {

            //PWD - 显示工作路径

            Connect();

            SendCommand("PWD");

            ReadResponse();

            if (response != 257)

            {

                errormessage += responseStr;

            }

            string pwd;

            try

            {

                pwd = responseStr.Substring(responseStr.IndexOf("\"", 0) + 1);//5);

                pwd = pwd.Substring(0, pwd.LastIndexOf("\""));

                pwd = pwd.Replace("\"\"", "\""); // 替换带引号的路径信息符号

            }

            catch (Exception ex)

            {

                errormessage += ex.Message;

                return null;

            }

            return pwd;

        }

 

        /// <summary>

        /// 跳转服务器上的当前(工作)路径

        /// </summary>

        /// <param name="path">要跳转的路径</param>

        public bool ChangeDir(string path)

        {

            Connect();

            SendCommand("CWD " + path);

            ReadResponse();

            if (response != 250)

            {

                errormessage += responseStr;

                return false;

            }

            return true;

        }

        /// <summary>

        /// 创建指定的目录

        /// </summary>

        /// <param name="dir">要创建的目录</param>

        public void MakeDir(string dir)

        {

            Connect();

            SendCommand("MKD " + dir);

            ReadResponse();

            switch (response)

            {

                case 257:

                case 250:

                    break;

                default:

                    {

                        errormessage += responseStr;

                        break;

                    }

            }

        }

        /// <summary>

        /// 移除FTP上的指定目录

        /// </summary>

        /// <param name="dir">要移除的目录</param>

        public void RemoveDir(string dir)

        {

            Connect();

            SendCommand("RMD " + dir);

            ReadResponse();

            if (response != 250)

            {

                errormessage += responseStr;

                return;

                ;

            }

        }

        /// <summary>

        /// 移除FTP上的指定文件

        /// </summary>

        /// <param name="filename">要移除的文件名称</param>

        public void RemoveFile(string filename)

        {

            Connect();

            SendCommand("DELE " + filename);

            ReadResponse();

            if (response != 250)

            {

                errormessage += responseStr;

            }

        }

        /// <summary>

        /// 重命名FTP上的文件

        /// </summary>

        /// <param name="oldfilename">原文件名</param>

        /// <param name="newfilename">新文件名</param>

        public void RenameFile(string oldfilename, string newfilename)

        {

            Connect();

            SendCommand("RNFR " + oldfilename);

            ReadResponse();

            if (response != 350)

            {

                errormessage += responseStr;

            }

            else

            {

                SendCommand("RNTO " + newfilename);

                ReadResponse();

                if (response != 250)

                {

                    errormessage += responseStr;

                }

            }

        }

        /// <summary>

        /// 获得指定文件的大小(如果FTP支持)

        /// </summary>

        /// <param name="filename">指定的文件</param>

        /// <returns>返回指定文件的大小</returns>

        public long GetFileSize(string filename)

        {

            Connect();

            SendCommand("SIZE " + filename);

            ReadResponse();

            if (response != 213)

            {

                errormessage += responseStr;

            }

            return Int64.Parse(responseStr.Substring(4));

        }

        /// <summary>

        /// 上传指定的文件

        /// </summary>

        /// <param name="filename">要上传的文件</param>

        public bool OpenUpload(string filename)

        {

            return OpenUpload(filename, filename, false);

        }

        /// <summary>

        /// 上传指定的文件

        /// </summary>

        /// <param name="filename">本地文件名</param>

        /// <param name="remotefilename">远程要覆盖的文件名</param>

        public bool OpenUpload(string filename, string remotefilename)

        {

            return OpenUpload(filename, remotefilename, false);

        }

        /// <summary>

        /// 上传指定的文件

        /// </summary>

        /// <param name="filename">本地文件名</param>

        /// <param name="resume">如果存在,则尝试恢复</param>

        public bool OpenUpload(string filename, bool resume)

        {

            return OpenUpload(filename, filename, resume);

        }

        /// <summary>

        /// 上传指定的文件

        /// </summary>

        /// <param name="filename">本地文件名</param>

        /// <param name="remote_filename">远程要覆盖的文件名</param>

        /// <param name="resume">如果存在,则尝试恢复</param>

        public bool OpenUpload(string filename, string remote_filename, bool resume)

        {

            Connect();

            SetBinaryMode(true);

            OpenDataSocket();

            bytes_total = 0;

            try

            {

                file = new FileStream(filename, FileMode.Open);

            }

            catch (Exception ex)

            {

                file = null;

                errormessage += ex.Message;

                return false;

            }

            file_size = file.Length;

            if (resume)

            {

                long size = GetFileSize(remote_filename);

                SendCommand("REST " + size);

                ReadResponse();

                if (response == 350)

                    file.Seek(size, SeekOrigin.Begin);

            }

            SendCommand("STOR " + remote_filename);

            ReadResponse();

            switch (response)

            {

                case 125:

                case 150:

                    break;

                default:

                    file.Close();

                    file = null;

                    errormessage += responseStr;

                    return false;

            }

            ConnectDataSocket();

            return true;

        }

        /// <summary>

        /// 下载指定文件

        /// </summary>

        /// <param name="filename">远程文件名称</param>

        public void OpenDownload(string filename)

        {

            OpenDownload(filename, filename, false);

        }

        /// <summary>

        /// 下载并恢复指定文件

        /// </summary>

        /// <param name="filename">远程文件名称</param>

        /// <param name="resume">如文件存在,则尝试恢复</param>

        public void OpenDownload(string filename, bool resume)

        {

            OpenDownload(filename, filename, resume);

        }

        /// <summary>

        /// 下载指定文件

        /// </summary>

        /// <param name="filename">远程文件名称</param>

        /// <param name="localfilename">本地文件名</param>

        public void OpenDownload(string remote_filename, string localfilename)

        {

            OpenDownload(remote_filename, localfilename, false);

        }

        /// <summary>

        /// 打开并下载文件

        /// </summary>

        /// <param name="remote_filename">远程文件名称</param>

        /// <param name="local_filename">本地文件名</param>

        /// <param name="resume">如果文件存在则恢复</param>

        public void OpenDownload(string remote_filename, string local_filename, bool resume)

        {

            Connect();

            SetBinaryMode(true);

            bytes_total = 0;

            try

            {

                file_size = GetFileSize(remote_filename);

            }

            catch

            {

                file_size = 0;

            }

            if (resume && File.Exists(local_filename))

            {

                try

                {

                    file = new FileStream(local_filename, FileMode.Open);

                }

                catch (Exception ex)

                {

                    file = null;

                    throw new Exception(ex.Message);

                }

                SendCommand("REST " + file.Length);

                ReadResponse();

                if (response != 350)

                    throw new Exception(responseStr);

                file.Seek(file.Length, SeekOrigin.Begin);

                bytes_total = file.Length;

            }

            else

            {

                try

                {

                    file = new FileStream(local_filename, FileMode.Create);

                }

                catch (Exception ex)

                {

                    file = null;

                    throw new Exception(ex.Message);

                }

            }

            OpenDataSocket();

            SendCommand("RETR " + remote_filename);

            ReadResponse();

            switch (response)

            {

                case 125:

                case 150:

                    break;

                default:

                    file.Close();

                    file = null;

                    errormessage += responseStr;

                    return;

            }

            ConnectDataSocket();

            return;

        }

        /// <summary>

        /// 上传文件(循环调用直到上传完毕)

        /// </summary>

        /// <returns>发送的字节数</returns>

        public long DoUpload()

        {

            Byte[] bytes = new Byte[512];

            long bytes_got;

            try

            {

                bytes_got = file.Read(bytes, 0, bytes.Length);

                bytes_total += bytes_got;

                data_sock.Send(bytes, (int)bytes_got, 0);

                if (bytes_got <= 0)

                {

                    //上传完毕或有错误发生

                    file.Close();

                    file = null;

                    CloseDataSocket();

                    ReadResponse();

                    switch (response)

                    {

                        case 226:

                        case 250:

                            break;

                        default: //当上传中断时

                            {

                                errormessage += responseStr;

                                return -1;

                            }

                    }

                    SetBinaryMode(false);

                }

            }

            catch (Exception ex)

            {

                file.Close();

                file = null;

                CloseDataSocket();

                ReadResponse();

                SetBinaryMode(false);

                //throw ex;

                //当上传中断时

                errormessage += ex.Message;

                return -1;

            }

            return bytes_got;

        }

        /// <summary>

        /// 下载文件(循环调用直到下载完毕)

        /// </summary>

        /// <returns>接收到的字节点</returns>

        public long DoDownload()

        {

            Byte[] bytes = new Byte[512];

            long bytes_got;

            try

            {

                bytes_got = data_sock.Receive(bytes, bytes.Length, 0);

                if (bytes_got <= 0)

                {

                    //下载完毕或有错误发生

                    CloseDataSocket();

                    file.Close();

                    file = null;

                    ReadResponse();

                    switch (response)

                    {

                        case 226:

                        case 250:

                            break;

                        default:

                            {

                                errormessage += responseStr;

                                return -1;

                            }

                    }

                    SetBinaryMode(false);

                    return bytes_got;

                }

                file.Write(bytes, 0, (int)bytes_got);

                bytes_total += bytes_got;

            }

            catch (Exception ex)

            {

                CloseDataSocket();

                file.Close();

                file = null;

                ReadResponse();

                SetBinaryMode(false);

                //throw ex;

                //当下载中断时

                errormessage += ex.Message;

                return -1;

            }

            return bytes_got;

        }

       001.png

本文转载自异步社区

原文链接:

https://www.epubit.com/articleDetails?id=N763b0130-afef-4509-87e2-b71145197e6f



【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。