1.我要下载的xml文件是别的网站上的,不可能打包,该网站只提供我URL,我需根据此URL将xml文件下载到我的网站上。2.这个网站会提供给我很多URL(大约50个,每个5M左右),我要用程序一次把它下载下来.3.我现在的程序有时能全下来,但有时会有几个下来了,但打开一看,文件前面正常,而后面显示:该页无法显示,然后是一些错误信息,这样的文件是不能用的,就算是没下来,怎样解决此问题.4.我的程序是参考某高手写的,断点续传的。5.我这个程序是给别人用的,所以不能用别的工具,只能自已做。用户只要点击按钮“下载”,程序自动执行,别的它就什么都不管了。

解决方案 »

  1.   

    2.这个网站会提供给我很多URL(大约50个,每个5M左右),我要用程序一次把它下载下来.3.我现在的程序有时能全下来,但有时会有几个下来了,但打开一看,文件前面正常,而后面显示:该页无法显示,然后是一些错误信息,这样的文件是不能用的,就算是没下来,怎样解决此问题.4.我的程序是参考某高手写的,断点续传的
    =============================================
    个人感觉你的文件很大,非常容易形成操作超时,你既然使用了断点续传,不要想把的一次下载来,可以分次,在程序里多使用try{}catch(){}来处理超时
    最后一个问题,另存为使保存下载到本地缓存的东西,当然快
      

  2.   

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

  3.   

    你使用什么连接服务器的,
    socket???
    webclient??
    webRequest??
    总之:你需要设定它的timeout,不要设定为无限制等待,
      

  4.   

    另外要检测服务器返回的http head
      

  5.   

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

  6.   

    正常,internet是个不稳定的网络环境
      

  7.   

    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;
    }以上是我所用的下载文件的代码,很好用,现在有一问题,想请高手指点:
      

  8.   

    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?
      

  9.   

    我想既然有时行有时不行,应该是网络的问题,访问intenet出现各种异常本来就是正常的,所以不要指望每次都能100%成功,反而是程序能够容错更重要,比如失败时提示用户并重试,或自动重试等等,总之把适应类似异常作为功能的一部分——另一种思路希望对你能有帮助
      

  10.   

    request.AddRange((int)lStartPos); //设置Range值
    =================>>
    改成
    request.AddRange((int)lStartPos , 0x10000); //设置Range值
    然后循环取试试
      

  11.   

    to : hdt(近来工作忙,每天只能接分半个小时)还是不行啊,我改成:request.AddRange((int)lStartPos , 0x10000),程序直接就跳到catch{}
    里了,请再指教.
      

  12.   

    int num=10240;//10Kbyte[] 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),而不一定就把整个文件读取完了,所以接下来的内容可能是错误的.
    应该用循环来读取文件,每次记录已写入文件的位置,下一次从此位置继续写入,直到你的文件大小与远程文件大小一致.
      

  13.   

    程序每次读取10K,如果不出问题,是可以把整个文件读完的啊。 cdo(VC?我才刚学): 循环来读取文件????
    我不太懂,怎么改一下呢/