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流关闭
        }

}
  }

c# Ftp下载程序源代码解析相关推荐

  1. USB接口一键下载程序电路解析

    Stm32烧写程序一般有两种方式:一种是基于JTAG(SWD)的程序下载方式,这种方式需要仿真器才能高效与快捷地调试STM32单片机系统,例如,J-LINK与U-LINK等均是很好的仿真器,这种方式的 ...

  2. 添加公司信息-公司宣传型小程序源代码下载1-视频教程24

    企业宣传型小程序对中小企业非常实用, 可以直接在子恒老师的小程序平台中下载, 主要有3个步骤: 1. 填写公司信息 2. 填写小程序信息 3. 生成小程序源代码并下载 我们会详细讲解这三个步骤, 今天 ...

  3. 【程序源代码】2021年终源码下载(第四篇)

    " 关键字:  "2021年终源码活动3" 一年工作已经到年尾了,这一年也将成为过去,回首过去一年来的工作生活,我们有过挫折,也有过收藏,捋一捋这一年来. 2021年是否 ...

  4. c语言象棋教程下载,C语言程序源代码中国象棋.doc-资源下载在线文库www.lddoc.cn...

    C语言程序源代码---中国象棋.doc includegraphics.hincludeconio.hincludestring.hincludebios.hincludestdlib.hinclud ...

  5. 车险计算器微信小程序源代码下载【工具型小程序】

    简单的计算让你知道车险的价值 前两天,一个小伙伴私信我,说想找一个车险计算器的小程序源代码. 然后小二特别注意它,发现这个 还用了一个简单的源代码,所以边肖把它发给了大家. 知道如何具体介绍它,所以让 ...

  6. ABAP表抛FTP通用程序

    主要功能: 1.支持R3所有表(标准.自建)下传,下传方式为FTP 2.支持输出字段选择及顺序调整 3.支持动态条件,不同的表会有不同的选择条件,根据不同的条件选择需要下传的数据 4.支持单表.多表. ...

  7. php下载apk文件源码下载,PHP_php下载文件源代码(强制任意文件格式下载),一个简单的php文件下载源代码 - phpStudy...

    php下载文件源代码(强制任意文件格式下载) 一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了.php下载文件其实用一个a标签就能实现,比如 magento-1.8.1 ...

  8. iOS之网络数据下载和JSON解析

    iOS之网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection从网络上下载数据, 如何解析下载下来的JSON数据格式, 以及如何显示数据和图片的异步 ...

  9. MP3在线搜索下载程序

    1.1 案例介绍 本案例是一个MP3在线搜索程序,输入歌曲的名字,就可以在互联网上搜索和下载歌曲.支持多线程并发下载. 1.1.1 目的和意义 MP3下载是一个非常有价值的应用.这个应用有两个典型特点 ...

最新文章

  1. jvm 系列(九):如何优化 Java GC 「译」
  2. Tomcat内存溢出解决办法
  3. 双系统装完只能u盘启动_苹果电脑安装双系统,切换MacOx系统和Windows系统!
  4. Python3判断自身脚本是不是在运行
  5. Waveform Audio 驱动(Wavedev2)之:WAV 驱动解析
  6. 小程序 封装table组件
  7. linux句柄过大导致无法登陆
  8. bjui 公共的弹窗确认 取消 改变文字
  9. win7美化_Windows桌面美化记(二)这可能是你看过最详细的美化教程
  10. linux命令关闭浏览器,linux命令行浏览器的使用方法
  11. 触摸屏分类和触摸屏校准原理
  12. 浏览器访问IPv6地址
  13. 调剂深圳大学计算机技术,深圳大学:2020年硕士研究生招生调剂办法公告
  14. 2009年 上海证券交易所新一代交易系统有多牛逼
  15. 获取滚动条滚动距离兼容写法
  16. RK3588和RK3588S芯片介绍
  17. Chrome浏览器运行超图三维场景
  18. unity 模拟弹簧
  19. [Extjs6]清除数组内容
  20. 大龄计算机考研 考研帮,过了40还想考研吗?大龄研究生讲述真实感受

热门文章

  1. leetcode209. 长度最小的子数组 借这个题规范一下双指针写法
  2. leetcode162. 寻找峰值 变种二分见过吗
  3. Redis:14---常用功能之(Pipeline)
  4. Mysql服务器线上配置主从同步
  5. C/C++函数名修饰约定
  6. 武术与软件设计 - 简单即是最好
  7. [WARNING] The POM for XXX-system:jar:1.9.0-SNAPSHOT is missing, no dependency information available
  8. 服务容错保护断路器Hystrix之七:做到自动降级
  9. 关于idea修改当前使用的git账户的问题
  10. 部署WEB项目到服务器(三)安装mysql到linux服务器(Ubuntu)详解