QHttp QNetworkAccessManager文件写入的问题

werther0331 2011-08-12 02:54:24
刚接触Qt,很多不懂,在此求教。

由于需要多线程批量下载文件,并立即使用,我用QThread配合QHttp或者QNetworkAccessManager。
假设fileName为a.part
QHttp下载文件用, http.get(url.path(), &file);
QNetwrokAccessManager用QNetworkReply获取并写入文件。

现在的问题是,程序运行后,会新建空文件a.part,但无内容;程序关闭后,a.part就有所下载的内容了。

单独提取下载部分的功能块进行测试,单步调试,http连接关闭,http完成信号发出,file.close()后,a.part依然为空文件。但在测试程序结束后的一瞬间,a.part中出现了下载的内容。

用网上别人提供的样例也是一样的结果。

这是怎么回事??Assisstant中没有相关说明……
...全文
275 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjianxinxh 2011-08-15
  • 打赏
  • 举报
回复
应该是下载完成之后没有及时的flush导致的吧
werther0331 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhu_xz 的回复:]

不要使用QHttp,这个类已经被淘汰了,而且在Qt5中将被删除

文件写入未能实时更新的问题,不知道是不是和你OS的IO优化有关?你是啥平台?
[/Quote]
linux的。用QNetwrokAccessManager可以,但在线程中使用出现问题。在子线程中创建了父线程中的信号和槽 的连接。所以想用QHttp。还有其他的可以使用的吗?
[Quote=引用 2 楼 dbzhang800 的回复:]

你描述的问题其实和网络部分没有任何关系,就是一个文件操作问题。

即使你不用QFile,而是用C++中的 fstream 或者 C 中的 FILE ,也会有同样的问题。

文件操作一定要有下面两个概念:
flush
close
[/Quote]
不是文件操作问题, flush和close都有。换个类,换个方法,都没问题。
yby4769250 2011-08-13
  • 打赏
  • 举报
回复
可以肯定的是,你的网络没有任何问题,内容都下载下来了,且都在app的buffer中,你的问题我也觉得应该是文件操作问题,如果flush都有了的话,你确定写文件的槽函数得到执行了?用qDebug()来测试看看嘛,在写文件和flush的后面都qDebug()看看
dbzhang800 2011-08-12
  • 打赏
  • 举报
回复
你描述的问题其实和网络部分没有任何关系,就是一个文件操作问题。

即使你不用QFile,而是用C++中的 fstream 或者 C 中的 FILE ,也会有同样的问题。

文件操作一定要有下面两个概念:
flush
close
zhu_xz 2011-08-12
  • 打赏
  • 举报
回复
不要使用QHttp,这个类已经被淘汰了,而且在Qt5中将被删除

文件写入未能实时更新的问题,不知道是不是和你OS的IO优化有关?你是啥平台?

16,235

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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