类代码:

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

namespace ConsoleTest
{
    class FtpDlder
    {
        public void download(String url, String localFile)
        {
            FtpWebRequest remoteFileLenReq; // 此请求是为了获取远程文件长度
            FtpWebRequest remoteFileReadReq;// 此请求是为了读取文件
            Stream readStream = null;       // 读取流
            FileStream writeStream = null;  // 写本地文件流

            try
            {
                writeStream = new FileStream(localFile, FileMode.Append);
                long startPosition=writeStream.Length;// 读出本地文件已有长度

                // 下面代码目的是取远程文件长度
                remoteFileLenReq = (FtpWebRequest)FtpWebRequest.Create(url);
                remoteFileLenReq.UseBinary = true;
                remoteFileLenReq.ContentOffset = 0;
                remoteFileLenReq.Method = WebRequestMethods.Ftp.GetFileSize;
                FtpWebResponse rsp = (FtpWebResponse)remoteFileLenReq.GetResponse();
                long totalByte = rsp.ContentLength;
                rsp.Close();

                if (startPosition >= totalByte)
                {
                    System.Console.WriteLine("本地文件长度" + startPosition + "已经大于等于远程文件长度" + totalByte);
                    writeStream.Close();

                    return;
                }

                // 初始化读取远程文件请求
                remoteFileReadReq = (FtpWebRequest)FtpWebRequest.Create(url);
                remoteFileReadReq.UseBinary = true;
                remoteFileReadReq.KeepAlive = false;
                remoteFileReadReq.ContentOffset = startPosition;
                remoteFileReadReq.Method = WebRequestMethods.Ftp.DownloadFile;
                FtpWebResponse response = (FtpWebResponse)remoteFileReadReq.GetResponse();
                readStream = response.GetResponseStream();

                long downloadedByte = startPosition;
                ;
                byte[] btArray = new byte[bufferSize];
                , btArray.Length);

                )
                {
                    downloadedByte += contentSize;
                     / totalByte);
                    System.Console.WriteLine("percent=" + percent + "%");

                    writeStream.Write(btArray, , contentSize);
                    contentSize = readStream.Read(btArray, , btArray.Length);
                }
                readStream.Close();
                writeStream.Close();
                response.Close();
                return;
            }
            catch (Exception)
            {
                return;

            }
            finally
            {
                if (readStream != null)
                {
                    readStream.Close();
                }
                if (writeStream != null)
                {
                    writeStream.Close();
                }
            }
        }
    }
}

使用示例:

        static void Main(string[] args)
        {
            // Ftp下载测试,无用户身份测试
            FtpDlder fd = new FtpDlder();
            fd.download("ftp://192.168.0.109/jump.jpg", "c:\\asd\\jump.jpg");
        }

以上代码参考了 http://blog.csdn.net/jiankunking/article/details/50017009 的代码,在此向原作者表示感谢。

2017年6月28日16:07:53

C# Ftp方式下载文件(无用户认证方式,支持断点续传)的更多相关文章

  1. C#- FTP递归下载文件

    c# ftp递归下载文件,找来找去这个最好.(打断点,一小处foreach要改成for) /// <summary> /// ftp文件上传.下载操作类 /// </summary& ...

  2. 通过cmd命令到ftp上下载文件

    通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp& ...

  3. Python之FTP多线程下载文件之分块多线程文件合并

    Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...

  4. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

  5. 【FTP】C# System.Net.FtpClient库连接ftp服务器(下载文件)

    如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...

  6. (4)FTP服务器下载文件

    上一篇中,我们提到了怎么从FTP服务器下载文件.现在来具体讲述一下. 首先是路径配置.. 所以此处我们需要一个app.config来设置路径. <?xml version="1.0&q ...

  7. linux FTP 批量下载文件

    wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理.wget名称的由来是“World Wide Web”与“ge ...

  8. 呵呵哒,LNMP下通过fread方式下载文件时,中文名称文件找不到文件

    哎,整整折腾一个下午. 本来好好的,thinkphp 自动的uniq方式保存的文件名,非要使用原文件名,真心蛋疼~~ 然后就只好写个脚本 把原来的所有文件都重新命名一下 - - 然后把数据库对应字段也 ...

  9. ajax方式下载文件

    在web项目中需要下载文件,由于传递的参数比较多(通过参数在服务器端动态下载指定文件),所以希望使用post方式传递参数.通常,在web前端需要下载文件,都是通过指定<a>标签的href属 ...

随机推荐

  1. java append方法

    JAVA 中 Stringbuffer 有append()方法  Stringbuffer其实是动态字符串数组  append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号  ...

  2. Python学习-day9 线程

    这节内容主要是关于线程的学习 首先要了解的什么是进程,什么是线程 进程与线程 什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称 ...

  3. [git 学习篇]git管理的是修改,并非文件

    你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. 为什么说Git管理的 ...

  4. phpcms调用一个指定的栏目

    很多初学者在学习phpcms的时候在模板中都是静态的写导航的url,那样在后期维护的时候可是个巨大的工程啊,所以我在学的时候就想起织梦是能指定调用栏目的url,借鉴了这一想法, {$CATEGORY[ ...

  5. 设计模式(二 & 三)工厂模式:1-简单工厂模式

    模拟场景: 需要构造一个运算器(Operation),分别负责加减乘除的运算功能. 思想: 这里需要构造四个 Operation,可以使用 Factory 去统一创建这四个对象. 所需要构造的对象是运 ...

  6. kb-01-a<简单搜索--dfs八皇后问题变种>

    题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的 ...

  7. 用meta标签让网页用360打开时默认为极速模式

    最近做项目,用360浏览器访问自己的本地网页,发现都是默认在兼容模式下打开,做的淡入淡出轮播效果在兼容模式下看时,感觉切换很生硬.百度,发现360官网帮助里有说明用meta标签控制浏览器内核,网址为h ...

  8. HDU——2087剪花布条

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. HDU——1303Doubles(水题,试手二分查找)

    Doubles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  10. BZOJ4566 [Haoi2016]找相同字符 【后缀数组】

    题目 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 输入格式 两行,两个字符串s1,s2,长度分别为n1,n2.1 & ...