try
            {
                //textBox2.AppendText(PnStr + "_" + PageNo + ".tif  开始重新下载\r\n");
                client.DownloadFile(OriUri, DownFileName);                Stream str = client.OpenRead(OriUri);                //StreamReader reader = new StreamReader(str);
                byte[] mbyte = new byte[100000];
                int allmybyte = (int)mbyte.Length;
                int startmbyte = 0;
                //textBox2.AppendText("正在接收数据..." + PnStr + "_" + PageNo + ".tif\r\n");
                while (allmybyte > 0)
                {
                    int m = str.Read(mbyte, startmbyte, allmybyte);
                    if (m == 0)
                        break;
                    startmbyte += m;
                    allmybyte -= m;
                }                FileStream fstr = new FileStream(DownFilePath, FileMode.OpenOrCreate, FileAccess.Write);
                fstr.Write(mbyte, 0, startmbyte);
                str.Close();
                fstr.Close();
                //textBox2.AppendText(PnStr + "_" + PageNo + ".tif 数据下载完成\r\n");
            }
            catch (WebException exp)
            {
                MessageBox.Show(exp.Message, "Error");
            }
这是我看到的一段下载文件的代码,我觉得奇怪的是client.DownloadFile(OriUri, DownFileName);就可以下载文件了,为什么还要后面写入流再保存,是不是多此一举呢,另外,直接保存和写入流效率是不是一样的?有没有通过压缩文件的方式来下载文?
谢谢!!!

解决方案 »

  1.   

    小文件直接用DownloadFile得了,下载大的文件需要用到Stream的那种风格,因为高手可以优化文件下载,比如到下一定程度就写一次硬盘,不是DownloadFile那样先放内存里面,下载完再写硬盘。如果那样的话下载1g的东西死得人的。DownloadFile用来作采集网页、图片得可以用。如果连人家的软件都用这个采集那么就惨了。
      

  2.   

    while (allmybyte > 0)
    {
          int m = str.Read(mbyte, startmbyte, allmybyte);
          if (m == 0)
               break;
          startmbyte += m;
          allmybyte -= m;
    }//怎么这么奇怪呢?
      

  3.   

    WebClient DownFile=new WebClient();
    str =DownFile.OpenRead(url);
    byte[] mbyte = new byte[1024]; 
    int readL=str.Read(mbyte,0,1024);
    fs=new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.Write);
    //读取流
    while(readL!=0)
    {
    if(stopDown)
    break;
    fs.Write(mbyte,0,readL);//写文件
    readL=str.Read(mbyte,0,1024);//读流
    }
    str.Close();
    fs.Close();
      

  4.   

    我的疑问就是:client.DownloadFile(OriUri, DownFileName); 这个函数可以直接保存到某个路径的,还需要再用流来写文件吗?我想DownloadFile应该也是用流来下载文件的吧?
      

  5.   

    你说的没错,client.DownloadFile就可以了
    用流只不过方便自己控制进度罢了,
    明显写重了
      

  6.   

    以我的知识,压缩只能在服务器端完成
    目前我所知道的解决办法只能是,通知服务器要下载的文件,然后让服务器给你打包后告诉你地址(可以用aspx访问,或webService),你在下载,下载后解包.
    打包和解饱的代码都得自己添,也可以打成象rar那样的自解压文件