1.我要下载的xml文件是别的网站上的,不可能打包,该网站只提供我URL,我需根据此URL将xml文件下载到我的网站上。2.这个网站会提供给我很多URL(大约50个,每个5M左右),我要用程序一次把它下载下来.3.我现在的程序有时能全下来,但有时会有几个下来了,但打开一看,文件前面正常,而后面显示:该页无法显示,然后是一些错误信息,这样的文件是不能用的,就算是没下来,怎样解决此问题.4.我的程序是参考某高手写的,断点续传的。5.我这个程序是给别人用的,所以不能用别的工具,只能自已做。用户只要点击按钮“下载”,程序自动执行,别的它就什么都不管了。
=============================================
个人感觉你的文件很大,非常容易形成操作超时,你既然使用了断点续传,不要想把的一次下载来,可以分次,在程序里多使用try{}catch(){}来处理超时
最后一个问题,另存为使保存下载到本地缓存的东西,当然快
socket???
webclient??
webRequest??
总之:你需要设定它的timeout,不要设定为无限制等待,
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;
}以上是我所用的下载文件的代码,很好用,现在有一问题,想请高手指点:
.....
<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?
=================>>
改成
request.AddRange((int)lStartPos , 0x10000); //设置Range值
然后循环取试试
里了,请再指教.
int nReadSize=0;
nReadSize=ns.Read(nbytes,0,num);
while( nReadSize >0)
{
fs.Write(nbytes,0,nReadSize);
nReadSize=ns.Read(nbytes,0,num);
}你上面的代码只读取了一次文件(10K),而不一定就把整个文件读取完了,所以接下来的内容可能是错误的.
应该用循环来读取文件,每次记录已写入文件的位置,下一次从此位置继续写入,直到你的文件大小与远程文件大小一致.
我不太懂,怎么改一下呢/