思路:首先获取本地临时文件的大小,在通过FTp的REST命令获取远程文件的偏移,然后再RETR命令在偏移处下载。while循环对比本地文件和远程文件的字节大小,如此

不断的反复以上过程,直到远程文件字节和本地文件字节一样,退出循环,下载完成。

    long remote_file_size = m_ftp->getFileLength(remoteFileName.toStdString());
long recvSize = ; if (remote_file_size == - )
{
return false;
} int conn_count = ; while (conn_count != && local_file_size != remote_file_size)
{
recvSize = m_ftp->Get2(remoteFileName.toStdString(), tmp_save_file_name.toStdString(), local_file_size);
if (recvSize <= )
{
msleep();
if (!reConnect())
{
break;
}
conn_count--;
} local_file_size = getLocalFileSize(tmp_save_file_name);
}
 FTP_API CFTP::Get2(const std::string &strRemoteFile, const std::string &strLocalFile, const int pos)
{
return downLoad2(strRemoteFile, strLocalFile, pos);
}
 FTP_API CFTP::downLoad2(const std::string &strRemoteFile, const std::string& strLocalFile, const int pos /*= 0*/, const unsigned int length /*= 0*/)
{
assert(length >= ); FILE *file = NULL;
unsigned long nDataLen = FTP_DEFAULT_BUFFER;
char strPos[MAX_PATH] = { };
int data_fd = socket(AF_INET, SOCK_STREAM, ); assert(data_fd != -); if ((length != ) && (length < nDataLen))
{
nDataLen = length;
}
char *dataBuf = new char[nDataLen];
if (dataBuf == NULL)
{
return -;
}
memset(dataBuf, , sizeof(dataBuf)); //assert(dataBuf != NULL); sprintf(strPos, "%d", pos); if (createDataLink(data_fd) < )
{
trace("@@@@ Create Data Link error!!!\n");
return -;
} std::string strCmdLine = parseCommand(FTP_COMMAND_DOWNLOAD_POS, strPos);//param 1 为REST命令
if (Send(m_cmdSocket, strCmdLine) < )
{
return -;
}
trace("@@@@Response: %s\n", serverResponse(m_cmdSocket).c_str()); strCmdLine = parseCommand(FTP_COMMAND_DOWNLOAD_FILE, strRemoteFile);//param 1为RETR命令 if (Send(m_cmdSocket, strCmdLine) < )
{
return -;
} std::string strResponse = serverResponse(m_cmdSocket);
trace("@@@@Response: %s\n", strResponse.c_str()); file = createLocalFile2(std::string(strLocalFile));
assert(file != NULL); int len = ;
int nReceiveLen = ;
while ((len = getData(data_fd, dataBuf, nDataLen)) > )
{
nReceiveLen += len; int num = fwrite(dataBuf, , len, file);
memset(dataBuf, , sizeof(dataBuf)); trace("Num:%d, nReceiveLen:%d\n", num, nReceiveLen); } Close(data_fd);
fclose(file);
delete[]dataBuf; return nReceiveLen; }

references:

http://blog.chinaunix.net/uid-7377299-id-112977.html

Ftp的断点下载实现的更多相关文章

  1. C#实现http断点下载

    我们寄希望于万能的解决方案,但是现实的情况总是很糟糕.在软件编程的世界中,技术分散的情况尤为严重,且不说各种语言拥有的优势不能融合,单就一门语言而言,就拥有众多的技术和相关技术需要学习.网络编程就是这 ...

  2. C# FTP上传下载(支持断点续传)

    <pre class="csharp" name="code"><pre class="csharp" name=&quo ...

  3. Java实现多线程断点下载(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...

  4. 安卓(android)之实现断点下载功能

    一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...

  5. iOS 大文件断点下载

    iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...

  6. 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】

    一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...

  7. JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)

    package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...

  8. IOS 断点下载

    // // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...

  9. .net网站的文件上传读取进度条和断点下载

    文件上传到服务器时的进度读取 //调整上传配置 AdapterInfo(info); UpfileResult result = new UpfileResult(); try { //直接使用req ...

随机推荐

  1. .gitignore模板

    github/gitignore · GitHub列举了一些有用的.gitignore的模板.比如这个是visual studio的. 另外说一个题外话,如果不想看见solution目录的那个sdf, ...

  2. SQL读取XML字段类型的信息

    USE CSOS_NEW_2 GO --(1)定义临时表 DECLARE @table TABLE(id INT IDENTITY(1,1),XMLDetail XML) DECLARE @xml X ...

  3. PHP安全编程:更优的会话数据安全 更好地防范session暴露(转)

    当你关注于防止源码的暴露时,你的会话数据只同样存在着风险.在默认情况下,SESSION保存在/tmp目录下.这样做在很多情形下是很方便的,其中之一是所有用户都有对/tmp的写入权限,这样Apache同 ...

  4. POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)

    树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...

  5. supervisor 部署文档

    supervisor 部署文档 supervisor 需要Python支持,如果不用系统的supervisor,单独安装python python 安装 #依赖 yum install python- ...

  6. 转载:浅析C#深拷贝与浅拷贝

    原文地址 :http://www.cnblogs.com/xugang/archive/2010/09/09/1822555.html   感谢博主分享! 也许会有人这样解释C# 中浅拷贝与深拷贝区别 ...

  7. H5移动端的注意细节

    1. max-width用在pc端页面,max-device-width用在移动设备上 2. device-pixel-ratio 设备像素比 3.设备自己单位-物理单位dp/dip css像素 px ...

  8. Java编程思想-注解生成外部例子代码

    如果本文帮助到您,请点击下面的链接,这是本人的网站,以示鼓励,谢谢!链接绝对安全! 本人的网站 java注解属于java中高大上的功能,许多开源框架都使用了java注解的功能.比如spring,hib ...

  9. 【转载】ASP.NET线程安全与静态变量的生命周期浅谈

    ASP.NET线程安全所涉及的是什么呢?让我们先来看看静态变量的生命周期问题,下面是我理解的静态变量的生命周期: void Application_Start开始 void Application_E ...

  10. 黑马程序员-for和foreach

    class Program { static void Main(string[] args) { Console.WriteLine("***第一种情况****************** ...