求思归,孟子等老大出手,文件下载的问题,第三贴了。

sywcf 2005-08-24 10:54:32
1.我要下载的xml文件是别的网站上的,不可能打包,该网站只提供我URL,我需根据此URL将xml文件下载到我的网站上。

2.这个网站会提供给我很多URL(大约50个,每个5M左右),我要用程序一次把它下载下来.

3.我现在的程序有时能全下来,但有时会有几个下来了,但打开一看,文件前面正常,而后面显示:该页无法显示,然后是一些错误信息,这样的文件是不能用的,就算是没下来,怎样解决此问题.

4.我的程序是参考某高手写的,断点续传的。

5.我这个程序是给别人用的,所以不能用别的工具,只能自已做。用户只要点击按钮“下载”,程序自动执行,别的它就什么都不管了。



...全文
537 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanzhihua520 2006-07-02
  • 打赏
  • 举报
回复
up
winterice 2005-08-26
  • 打赏
  • 举报
回复
Up, 接分
sywcf 2005-08-25
  • 打赏
  • 举报
回复
我有些明白了,谢谢楼上
sywcf 2005-08-25
  • 打赏
  • 举报
回复
程序每次读取10K,如果不出问题,是可以把整个文件读完的啊。

cdo(VC?我才刚学): 循环来读取文件????
我不太懂,怎么改一下呢/

cdo 2005-08-25
  • 打赏
  • 举报
回复
int num=10240;//10K

byte[] nbytes = new byte[num];
int nReadSize=0;
nReadSize=ns.Read(nbytes,0,num);
while( nReadSize >0)
{
fs.Write(nbytes,0,nReadSize);
nReadSize=ns.Read(nbytes,0,num);
}

你上面的代码只读取了一次文件(10K),而不一定就把整个文件读取完了,所以接下来的内容可能是错误的.
应该用循环来读取文件,每次记录已写入文件的位置,下一次从此位置继续写入,直到你的文件大小与远程文件大小一致.
sywcf 2005-08-25
  • 打赏
  • 举报
回复
今天的问题好奇怪,我把文件下载到网站上,就是不成功,但是下到本地确能成功!
sywcf 2005-08-25
  • 打赏
  • 举报
回复
今天又有多个不能下来的,有我的下了3次才下来。但不是断点续传的,而是全部重新下的。
sywcf 2005-08-25
  • 打赏
  • 举报
回复
to : hdt(近来工作忙,每天只能接分半个小时)

还是不行啊,我改成:request.AddRange((int)lStartPos , 0x10000),程序直接就跳到catch{}
里了,请再指教.
sywcf 2005-08-24
  • 打赏
  • 举报
回复
多谢楼上老大精彩回答.

我的程序里已经用了很多try()了,关键就是,我虽然try()了,但是如果某个文件已经超时,它并不执行catch()操作,就像没事一样,正常下,我打开一看就有可能少了一部分内容,然后后面也提示超时,是我的程序还不够完善吗?

真相重于对错 2005-08-24
  • 打赏
  • 举报
回复
2.这个网站会提供给我很多URL(大约50个,每个5M左右),我要用程序一次把它下载下来.

3.我现在的程序有时能全下来,但有时会有几个下来了,但打开一看,文件前面正常,而后面显示:该页无法显示,然后是一些错误信息,这样的文件是不能用的,就算是没下来,怎样解决此问题.

4.我的程序是参考某高手写的,断点续传的
=============================================
个人感觉你的文件很大,非常容易形成操作超时,你既然使用了断点续传,不要想把的一次下载来,可以分次,在程序里多使用try{}catch(){}来处理超时
最后一个问题,另存为使保存下载到本地缓存的东西,当然快


sywcf 2005-08-24
  • 打赏
  • 举报
回复
还有,有时用程序下载一个文件没有右键的"另存为"快,为什么呢?另存为是什么原理呢?
真相重于对错 2005-08-24
  • 打赏
  • 举报
回复
request.AddRange((int)lStartPos); //设置Range值
=================>>
改成
request.AddRange((int)lStartPos , 0x10000); //设置Range值
然后循环取试试

fuquanyong 2005-08-24
  • 打赏
  • 举报
回复
我想既然有时行有时不行,应该是网络的问题,访问intenet出现各种异常本来就是正常的,所以不要指望每次都能100%成功,反而是程序能够容错更重要,比如失败时提示用户并重试,或自动重试等等,总之把适应类似异常作为功能的一部分——另一种思路希望对你能有帮助
sindia 2005-08-24
  • 打赏
  • 举报
回复
up
sywcf 2005-08-24
  • 打赏
  • 举报
回复
1.我的文件下载完后,打开发现是这样的:

......
.....
<str date="2005-06-17" content="yp116288-1" />
<str date="2005-06-17" content="yp116288-1
无法显示 XML 页。

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。

.......
.....

接下来我再下载时,程序是从content="yp116288-1 位置开始下载呢?还是从
使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。

.......
.....
开始下载呢?

我想让它从content="yp116288-1 下载,这才是正确的。

2.如果该文件正常下载成功后,只有1M;但如果期间没下来,我用断点续传,为什么文件会大于1M?

koenemy 2005-08-24
  • 打赏
  • 举报
回复
up
sywcf 2005-08-24
  • 打赏
  • 举报
回复
string StrFileName=LocalFullPath; //根据实际情况设置
string StrUrl=DownLoadUrl; //根据实际情况设置
long lStartPos =0;
System.IO.FileStream fs;

try
{
//打开上次下载的文件或新建文件
if (System.IO.File.Exists(StrFileName))
{
fs= System.IO.File.OpenWrite(StrFileName);
lStartPos=fs.Length;
fs.Seek(lStartPos,System.IO.SeekOrigin.Current); //移动文件流中的当前指针
}
else
{
fs = new System.IO.FileStream(StrFileName,System.IO.FileMode.Create);
lStartPos =0;
}
}
catch
{
return false;
}

//打开网络连接
try
{
System.Net.HttpWebRequest request =(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
if ( lStartPos>0)
request.AddRange((int)lStartPos); //设置Range值

//向服务器请求,获得服务器回应数据流
System.IO.Stream ns= request.GetResponse().GetResponseStream();

int num=10240;//10K

byte[] nbytes = new byte[num];
int nReadSize=0;
nReadSize=ns.Read(nbytes,0,num);
while( nReadSize >0)
{
fs.Write(nbytes,0,nReadSize);
nReadSize=ns.Read(nbytes,0,num);
}
fs.Close();
ns.Close();

return true;
}
catch
{
fs.Close();
return false;
}

以上是我所用的下载文件的代码,很好用,现在有一问题,想请高手指点:

真相重于对错 2005-08-24
  • 打赏
  • 举报
回复
正常,internet是个不稳定的网络环境
sywcf 2005-08-24
  • 打赏
  • 举报
回复
我用的是:HttpwebRequest

那么我下载这么些,有个别下不来,是不是属正常现象呢/

真相重于对错 2005-08-24
  • 打赏
  • 举报
回复
另外要检测服务器返回的http head
加载更多回复(1)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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