• c# Ftp下载程序源代码解析


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Threading.Tasks;
    using System.Windows.Forms;


    namespace 网络操作
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            private void menuStrip2_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
            {


            }


            private void button1_Click_1(object sender, EventArgs e)
            {
                FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(textBox1.Text);//能够是ftpserver的绝对路径也能够是相对路径
                //URI 能够是相对的也能够是绝对的。假设 URI 的形式为 "ftp://contoso.com/%2fpath"(%2f 是转义字符“/”),则该 URI 是绝对的,并且当前文件夹为 /path。可是,假设 URI 的形式为 "ftp://contoso.com/path",首先 .NET Framework 登录到 FTP server(使用由 Credentials 属性设置的username和password),然后将当前文件夹设置为 <UserLoginDirectory>/path。
                //uri不是url所以第一个文本框中应该输入ftp://url/cftea.txt
                ftpRequest.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
                //您必须拥有server的有效username和password,或者server必须同意匿名登录。能够通过设置 Credentials 属性来指定用于连接server的凭据,也能够将它们包括在传递给 Create 方法的 URI 的 UserInfo 部分中。假设 URI 中包括 UserInfo 信息,则使用指定的username和password信息将 Credentials 属性设置为新的网络凭据。
                //为基于password的身份验证方案(如基本、简要、NTLM 和 Kerberos 身份验证)提供凭据。
                //此类不支持基于公钥的身份验证方法,如安全套接字层 (SSL) client身份验证
                //public NetworkCredential(string userName,string password)
                
                FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                //若要訪问 FTP 特定的属性,必须将此方法返回的 WebResponse 对象强制转换为 FtpWebResponse。
                //返回 FTP server响应。
                //FtpWebResponse封装文件传输协议 (FTP) server对请求的响应。


                Stream data = ftpResponse.GetResponseStream();  //通过响应对象获得响应流
                //获取流,该流用于读取来自server的响应的体
                //本程序中 检索包括从 FTP server上发送的响应数据的流
               //get方法的 返回值一个 Stream,包括响应的体。
                //GetResponseStream 方法从请求的 Internet 资源返回数据流。
                string str = textBox1.Text.Substring(textBox1.Text.LastIndexOf("/"), textBox1.Text.Length - textBox1.Text.LastIndexOf("/"));
                //函数參数1和參数2在 startIndex 处开头、长度为 length 的子字符串等效的一个字符串假设找到该字符,则为 value 的从零開始的索引位置;假设未找到,则为 -1。
                //str.length当前字符串中字符的数量。
                //  报告指定 Unicode 字符在此实例中的最后一个匹配项的从零開始的索引位置。(本例中为最后一个/的下标位置)
                //最后提取出的字符串为textBox1.Text去除/之前的字符
                string SavePath = str;
                if (File.Exists(SavePath))
                {
                    File.Delete(str);
                }
                byte[] buffer = new byte[4096];
                FileStream stream = new FileStream(SavePath, FileMode.Create);
                //使用指定的路径和创建模式初始化 FileStream 类的新实例。由 .NET Compact Framework 支持。
                //摘要: 
                //指定操作系统应创建新文件。 假设文件已存在,它将被覆盖。 这须要 System.Security.Permissions.FileIOPermissionAccess.Write
                 //权限。 FileMode.Create 等效于这种请求:假设文件不存在,则使用 System.IO.FileMode.CreateNew;否则使用
                //System.IO.FileMode.Truncate。 假设该文件已存在但为隐藏文件,则将引发 System.UnauthorizedAccessException异常。
                int count = 0;
                do
                {
                    count = data.Read(buffer, 0, buffer.Length); //读取从ftp中获得的响应的数据流对象
                    //public abstract int Read(byte[] buffer,int offset,int count)第一个參数为字节第二个为偏移量第三个为读取的字符数
                    if (count > 0)
                    {
                        stream.Write(buffer, 0, count);//參照read  
                        //这个是文件流对象通过从ftp中获得的数据流開始读取字符然后写入文件流来保存
                    }
                } while (count > 0);
                //读入缓冲区中的总字节数。 假设当前可用的字节数没有请求的字节数那么多,
                //则总字节数可能小于请求的字节数,或者假设已到达流的末尾,则为零 (0)
                ftpResponse.Close();//上一句是打算将字符串读完,这一句是FtpWebResponse对象流关闭
                stream.Close();   //stream流关闭
            }


            }
      }

  • 相关阅读:
    spring bean 循环依赖问题,在本地环境可以,测试环境报循环依赖问题
    mac 使用
    TCP状态
    Flink 学习 — Flink JobManager 高可用性配置
    Flink 学习 — Flink 写入数据到 Kafka
    Flink 学习 — 上传Flink 项目JAR运行
    Flink 学习 — Flink 写入数据到 ElasticSearch
    Redis持久化原理 — RDB与AOF详细解释
    Flink 学习 — Flink 中几种 Time 详解
    Flink 学习 — Flink中的Stream Windows介绍
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4075506.html
Copyright © 2020-2023  润新知