C#学习笔记之从FTP服务器上传和下载数据(二)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Windows.Forms;

namespace PrinterDemo
{
    class FtpDemo
    {
        /// <summary>
        /// ftp有两种使用模式:主动和被动;
        ///     主动模式要求客户端和服务器同时打开并且监听一个端口以建立连接;这种情况下,由于防火墙的存在,会出现一些问题;
        ///     被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过防火墙。
        /// <summary>
        /// 上传数据到ftp服务器 
        /// </summary>
        /// <param name="ftpServerIP">FTP服务器的IP地址</param>
        /// <param name="ftpUserID">FTP服务器的登录用户名</param>
        /// <param name="ftpPassword">FTP服务器的登录密码</param>
        /// <returns></returns>
        public static int UploadFtp(string ftpServerIP, string ftpUserID, string ftpPassword)
        {
            // 需要上传到FTP服务器的本地文件
            FileInfo fileInfo = new FileInfo("D://temp//data.txt");
            
            // 用于接收上传文件的FTP服务器上的文件地址
            string uri = "ftp://" + ftpServerIP + "/data.txt";

            // 实例化FTP服务器连接对象,创建连接
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            try
            {
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // 设置FTP服务器的用户名和密码
                reqFTP.KeepAlive = false;   // 执行完命令之后关闭连接
                reqFTP.UseBinary = true;    // 使用二进制传输方式
                reqFTP.EnableSsl = false;   // 不使用SSL连接
                reqFTP.UsePassive = true;   // 使用被动模式
                
                // 指定发送到FTP服务器的命令为:上传
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                
                int buffLength = 1024;
                byte[] buff = new byte[buffLength];

                // 读取本地文件数据流
                FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                int contentLen = fs.Read(buff, 0, buffLength);

                // 通过FTP服务器上传数据流将本地文件数据写入到服务器上
                Stream strm = reqFTP.GetRequestStream();
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }

                // 关闭流
                strm.Close();
                fs.Close();
                return 0;
            }
            catch (Exception ex)
            {
                return -1;
            }
        }

        /// <summary>
        /// ftp方式下载(从FTP服务器上指定的文件中下载数据)
        /// </summary>
        /// <returns></returns>
        public static int DownloadFtp(string ftpServerIP, string ftpUserID, string ftpPassword)
        {
            // 本地文件,用于接收从FTP服务器下载的数据
            FileStream outputStream = new FileStream("D://temp//hello.txt", FileMode.OpenOrCreate);

            try
            {
                // 指定服务器上要下载的文件路径,创建一个FTP请求,建立连接
                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/data.txt"));
                
                // 指定ftp服务器的登录用户名和密码
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.UseBinary = true;    // 使用二进制传输方式
                reqFTP.KeepAlive = false;   // 命令执行之后关闭连接
                reqFTP.EnableSsl = false;   // 不使用SSL连接
                reqFTP.UsePassive = true;   // 使用被动模式

                // 设置要发送到FTP服务器的命令为:下载
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

                // 获取FTP服务器响应的数据流
                Stream ftpStream = reqFTP.GetResponse().GetResponseStream();

                // 读取FTP服务器上指定文件的数据
                byte[] buffer = new byte[1024];
                int readCount = ftpStream.Read(buffer, 0, 1024);
                while (readCount > 0)
                {
                    // 将从FTP服务器上读取的数据写入本地文件中
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, readCount);
                }

                ftpStream.Close();
                outputStream.Close();
                return 0;
            }
            catch (Exception ex)
            {
                return -1;
            }
        }

        // 遍历FTP服务器根目录下所有的文件,并下载指定的文件
        public static void FindAllFileFromFtp(string ftpServerIP, string ftpUserID, string ftpPassword)
        {
            string sfz = "370820199507215311";
            string date = DateTime.Now.ToString("yyyyMMdd"); 
            try
            {
                // 创建一个FTP请求,建立连接
                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP));
                
                // 指定ftp服务器的登录用户名和密码
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.UseBinary = true;    // 使用二进制传输方式
                reqFTP.KeepAlive = false;   // 命令执行之后关闭连接
                reqFTP.EnableSsl = false;   // 不使用SSL连接
                reqFTP.UsePassive = true;   // 使用被动模式

                // 设置要发送到FTP服务器的命令为:获取服务器上的文件列表
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;

                // 获取FTP服务器的相应数据流
                Stream stream = reqFTP.GetResponse().GetResponseStream();

                // 根据FTP服务器的相应数据流实例化一个 读入流
                StreamReader reader = new StreamReader(stream, Encoding.Default);
                String fileName = reader.ReadLine(); // 读取ftp服务器上的一行数据
                while (fileName != null)
                {
                    // fileName = "JS201700000082_370820199507215311_20170802.zip";
                    if (fileName.EndsWith(".zip"))
                    {
                        String[] fileNames = fileName.Split('_');
                        if (fileNames[1].Equals(sfz) && fileNames[2].Equals(date + ".zip"))
                        {
                            // 下载指定的文件
                            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
                            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

                            Stream ftpStream = reqFTP.GetResponse().GetResponseStream();

                            byte[] buffer = new byte[1024];
                            // 实例化本地文件的输入流,用于接收从FTP服务器下载的数据
                            FileStream outputStream = new FileStream("D://temp//" + fileName, FileMode.OpenOrCreate);

                            int readCount = ftpStream.Read(buffer, 0, 1024);
                            while (readCount > 0)
                            {
                                outputStream.Write(buffer, 0, readCount);
                                readCount = ftpStream.Read(buffer, 0, 1024);
                            }

                            ftpStream.Close();
                            outputStream.Close();
                            return;
                        }
                    }

                    fileName = reader.ReadLine();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值