HTTP下载保存文件问题!!!!!!!!!
在S60上开发一个Http下载的程序,接收到文件后使用流存储到文件,代码如下:iStream->WriteL(aBodyData);
iStream->CommitL();
其中iStream为RFileWriteStream对象,aBodyData为接收到的内容!
使用这种方法导致整个程序在保存文件的时候非常慢,处于长时间等待状态,不能进行其它的操作,请问各位大侠有何好的解决方案! --------------------编程问答-------------------- 手机上http接收的时候,每次recv一般都是1-2k左右,一边接收,一般保存,感觉不到延迟阿 --------------------编程问答-------------------- 可以考虑使用RFile::Write()的异步方法并通过活动对象来实现.
void Write(const TDesC8& aDes,TRequestStatus& aStatus);
--------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- 在收到header时打开流,body时一直写入,直到最后body关闭流。 --------------------编程问答-------------------- 可能会死
因为一直接收数据 一直写
用多线程吧 --------------------编程问答-------------------- 楼上说的“可能会死”是正确的,这是软件的共性,与后面的原因不相干吧。
此外,多线程计划怎么用?难道会替代读写文件? --------------------编程问答-------------------- 用异步模式,不然write会阻塞进程
同步模式总是等待http一个会话结束再返回 --------------------编程问答-------------------- 异步模式?从实际使用来看没有必要,网络操作比文件写入慢许多。也从未碰到数据丢失的情况。
为何“同步模式总是等待http一个会话结束再返回”?只文件写入而已,当收到body信息时写入文件即可。 --------------------编程问答-------------------- dyw
道不同不相为谋
等 级:
发表于:2008-01-11 22:08:467楼 得分:0
楼上说的“可能会死”是正确的,这是软件的共性,与后面的原因不相干吧。
此外,多线程计划怎么用?难道会替代读写文件?
==============================
我这里的“可能会死”指机器很慢,处于长时间等待状态,不能进行其它的操作
这个我也遇到过, 比如我下载一个大概有1M多的文件, 那么就会有几百次的内存操作,
但是这个时候我还都没有写入文件中, 还是“处于长时间等待状态,不能进行其它的操作”
具体原因我也不理解,难道这里变成同步的了?所以我想如果采用另外一个服务进程帮我处理网络数据,是不是可以避免。
具体没有实施,没那么多时间,“不能进行其它的操作”那就让用户等吧 --------------------编程问答-------------------- 这个程序我实现过,用http上传下载都很正常。
速度很快。
肯定是write函数用的不对。
--------------------编程问答-------------------- mark --------------------编程问答-------------------- RFs rfs;
RFile rfile;
User::LeaveIfError (rfs.Connect ( ) );
ConeUtils::EnsurePathExistsL ( filepath );
TInt err = rfile.Open (rfs, filepath, EFileRead|EFileWrite );
if (err != KErrNone )
{
TRAPD(err,BaflUtils::EnsurePathExistsL(rfs,filepath))
;
User::LeaveIfError (rfile.Create (rfs, filepath, EFileWrite ) );
}
TInt bytes;
rfile.Size (bytes );
TInt len = aBodyData.Length ( );
if ( len <= 0 )
return;
HBufC8 *temp = aBodyData.Alloc ( );
rfile.Write (bytes, (TDes8 &)temp->Des() );
rfile.Close ( );
rfs.Close ( );
//HTTP下载文件分段来接收,保存文件也必须下载多少保存多少,没次打开时先判断文件存在不存在.不存在先创建,存在则写到文件的后面.(还可以实现断点续传)! --------------------编程问答--------------------
汗,看错了,还以为是HTTP的类,原来就是写文件啊,应该没必要异步,文件操作相对比较快,可能是别的地方阻塞进程了 --------------------编程问答-------------------- 这个我做过一点,贴一段代码:
case THTTPEvent::EGotResponseHeaders:
{
RHTTPResponse resp = aTransaction.Response();
TInt statusCode = resp.StatusCode();
if(statusCode == 200)
{
User::LeaveIfError(iFs.Connect());
if (BaflUtils::FileExists( iEikEnv->FsSession(),iFileName) )
iFile.Replace(iFs,iFileName,EFileWrite);
else
iFile.Create(iFs,iFileName,EFileWrite);
}
else
{
}
}
break;
case THTTPEvent::EGotResponseBodyData:
{
MHTTPDataSupplier* body = aTransaction.Response().Body();
TPtrC8 ptr;
iIsLast = body->GetNextDataPart(ptr);
TInt index = 0;
iFile.Seek(ESeekEnd,index);
iFile.Write(index,ptr);
if(iIsLast)
{
iFile.Close();
iFs.Close();
}
} --------------------编程问答-------------------- 建议:在论坛搜一下“Http”,会有你想要的资料的。
下面这个帖子对将数据写入数据到文件挺有用的:
http://topic.csdn.net/u/20071211/21/ea4b6881-4da4-4c49-adde-7420f59ed453.html --------------------编程问答--------------------
建议:在论坛搜一下“Http”,会有你想要的资料的。
下面这个帖子对将数据写入到文件挺有用的:
http://topic.csdn.net/u/20071211/21/ea4b6881-4da4-4c49-adde-7420f59ed453.html
--------------------编程问答--------------------
建议:在论坛搜一下“Http”,会有你想要的资料的。
下面这个帖子对将数据写入到文件挺有用的:
http://topic.csdn.net/u/20071211/21/ea4b6881-4da4-4c49-adde-7420f59ed453.html --------------------编程问答-------------------- mark
补充:移动开发 , Symbian