Ftp的断点下载实现
思路:首先获取本地临时文件的大小,在通过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的断点下载实现的更多相关文章
- C#实现http断点下载
我们寄希望于万能的解决方案,但是现实的情况总是很糟糕.在软件编程的世界中,技术分散的情况尤为严重,且不说各种语言拥有的优势不能融合,单就一门语言而言,就拥有众多的技术和相关技术需要学习.网络编程就是这 ...
- C# FTP上传下载(支持断点续传)
<pre class="csharp" name="code"><pre class="csharp" name=&quo ...
- Java实现多线程断点下载(下载过程中可以暂停)
线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...
- 安卓(android)之实现断点下载功能
一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...
- iOS 大文件断点下载
iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
- IOS 断点下载
// // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...
- .net网站的文件上传读取进度条和断点下载
文件上传到服务器时的进度读取 //调整上传配置 AdapterInfo(info); UpfileResult result = new UpfileResult(); try { //直接使用req ...
随机推荐
- Ruby On Rails 4 hello world,Ruby On Rails上手
有机会再试一试Rails了,仅仅是原来接触的是2,如今已然变成了4,似乎如今的安装比原来会快些.. Rails 4 安装 针对于安装了RVM gem install rails 没有的话应该主 sud ...
- JavaScript和prototype
Protoype这个词在javascript中可以有两种理解: 第一种是作为javascript中的一个属性,其一般出现的形式为:类名.prototype. prototype 属性让你有能力向对象添 ...
- 刨根问底:对于 self = [super init] 的思考
对象初始化有两种方式:[class new] 与 [[class alloc] init] 对于后者,有分配和初始化的过程,alloc 从应用程序的虚拟地址空间上为该对象分配足够的内存,并且将新对象的 ...
- DTD简单使用
DTD:Document Type Definition DTD是一种简单的XML约束模式语言 DTD文档必须以utf-8或unicode编码 注释方式与HTML.XML文档相同 DTD文档的引用:紧 ...
- 【开源java游戏框架libgdx专题】-09-动画的使用
1.Animation类介绍 Api定义:动画是由多个帧,在设定的时间间隔序列显示.比如,一个跑步的人一个动画可以通过运行时播放这些图像无限拍照他了. 功能用法:管理动画,设置随即播放模式和播放顺 ...
- 第二部分面向对像基础第五章Strng类中方法的使用
package com.java.oop.day2; import java.util.Calendar; import java.util.Formatter; import java.util.L ...
- Google2016开发者大会
Android主讲: 一.吴晶:android笔记博主(博客:http://www.race604.com/) 主题:Android低功耗蓝牙(BLE)实践 低功耗蓝牙在可穿戴和智能家居里边用的比较多 ...
- Kill Processes in Linux
Step 1: find processes to kill ps -ef | grep java Step 2: Kill the process based on process id kill ...
- cas sso单点登录系列3_cas-server端配置认证方式实践(数据源+自定义java类认证)
转:http://blog.csdn.net/ae6623/article/details/8851801 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2 ...
- spring 4 xxx 与jackson-dataformat.xxx类冲突
这段时间,做一个新的工作流的开发,在开始之初,用的jbpm,后来发现jbpm现在开发有问题,不能引用官方的工作空间,所要工作流跑不起来,于是用了activiti工作流,在配置spring和activi ...