关于FTP断点续传的问题

Sumel 2005-10-26 11:20:23
TFileStream* fileStream = new TFileStream(LoadFilePath, fmCreate||fmShareDenyNone);
fileStream->Seek(RemoteFileSize,soFromBeginning);
while(fileStream->Position<fileStream->Size)
{
s = 4096;
int k = 0;
void *buf;
k = fileStream->Size - fileStream->Position;
if(k<=s)
s = k;
TMemoryStream* MyStream = new TMemoryStream();
buf = malloc(s); //s
fileStream->Read(buf,s); //s
MyStream->Write(buf,s); //s
MyStream->Seek(0,soFromBeginning);
IdFTP1->Put(MyStream,ExtractFileName(LoadFilePath),true);
fileStream->Seek(s,soFromCurrent);
free(buf);
MyStream->Free();
}
fileStream->Free();

说明:
LoadFilePath:要上传的文件(包括路径和文件名)
RemoteFileSize:FTP服务器上已经上传文件的大小
续传后,文件大小虽然和本地的大小一样,可是FTP上文件因为续传损坏了,可执行文件大不开;有300多个的PDF文件压缩包,只能看到第一次上文的文件,也就是断点续传前上传的PDF文件,
请帮帮忙看看,斧正一下好吗?
...全文
403 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjun716 2005-11-16
  • 打赏
  • 举报
回复
你都改了哪些地方,能把你的代码发一份我看看吗?多谢!

wukong716@hotmail.com
ly_liuyang 2005-11-16
  • 打赏
  • 举报
回复
我是通过修改Indy源码实现的


需要Rest指定断点,然后Stream移动到断点,再Stor发送
chenjun716 2005-11-09
  • 打赏
  • 举报
回复
和你程序一样。
void __fastcall TForm1::Button4Click(TObject *Sender)
{
AnsiString remotefile;
if(OpenDialog1->Execute())
{
InputQuery("文件上传","请输入上传后的文件名",remotefile);
if(IdFTP1->Size(remotefile) != -1)
{
ShowMessage("文件存在,断点续传!");

AnsiString localfilename;
localfilename = OpenDialog1->FileName;

//创建一个本地文件的文件流对象并实例化
TFileStream* fileStream = new TFileStream(localfilename, fmCreate||fmShareDenyNone);
//soFromBeginning||soFromCurrent||soFromEnd
fileStream->Seek(IdFTP1->Size(remotefile),soFromBeginning);

//服务器文件流大小 小于 本地文件流大小
while(fileStream->Position < fileStream->Size)
{
int s = 4096;
int k = 0;
void *buf;

//K为需要续传的文件流大小
k = fileStream->Size - fileStream->Position;
if(k<=s)
{
s = k;
}


TMemoryStream* MyStream = new TMemoryStream();

buf = malloc(s); //s
//读取文件流
fileStream->Read(buf,s); //s

MyStream->Seek(0,soFromBeginning);
//写入内存流
MyStream->Write(buf,s); //s
MyStream->Seek(0,soFromBeginning);

//上传
IdFTP1->Put(MyStream,remotefile,true);
fileStream->Seek(s,soFromCurrent);

free(buf);
MyStream->Free();
}
fileStream->Free();

//IdFTP1->Put(OpenDialog1->FileName,remotefile,true);
}
else
IdFTP1->Put(OpenDialog1->FileName,remotefile,false);
}
}
chenjun716 2005-11-08
  • 打赏
  • 举报
回复
我下了个,通过比较发现从断点继传处是出现了问题,但不知道具体是什么原因造成?也分析不出对错的位数?从损坏的文件看,感觉损坏的文件名中在断点续传处有文件名的内容,可能在续传时把文件名写入了文件内??
Sumel 2005-11-08
  • 打赏
  • 举报
回复
代码看看
Sumel 2005-11-05
  • 打赏
  • 举报
回复
是的,是断点位置没有对好.
推荐一个软件UltraEdit可以分析断点的16进制码,找出原因
asdfg014 2005-11-04
  • 打赏
  • 举报
回复
路过不会错过
chenjun716 2005-11-03
  • 打赏
  • 举报
回复
什么地方对错了?
constantine 2005-10-31
  • 打赏
  • 举报
回复
应该是流对错1位吧
chenjun716 2005-10-30
  • 打赏
  • 举报
回复
怎么解决的?说说!学习学习。
Sumel 2005-10-28
  • 打赏
  • 举报
回复
断点上传自己搞定,揭贴
Sumel 2005-10-27
  • 打赏
  • 举报
回复
向各位高手求救~~~
Sumel 2005-10-26
  • 打赏
  • 举报
回复
自己顶一下先~~~~~

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧