我用以下的方法,可是我测试过,跟踪文件段的length,发现竟然为负数的,晕.
请高人抽空看下,小弟不胜感激啊!using System;
using System.IO;
using System.Net;namespace Down.Lib
{
/// <summary>
/// Description of HttpDown.
/// </summary>
public class HttpDown
{
private int position;
private int length;
private int threadId;
private string url;
private string saveFolder;
private HttpWebRequest req;
private HttpWebResponse res;
private Stream stm;
private FileStream fw;
public HttpDown(int position,int length,string saveFolder,string url)
{
this.url=url;
this.position=position;
this.length=length;
this.saveFolder=saveFolder;
}
public static long GetContentLength(string url)
{
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res=(HttpWebResponse)req.GetResponse();
long l=res.ContentLength;
res.Close();
return l;
}
public int DoDownload()
{
int total=0,read=0;
try{
string fileName=url.Substring(url.LastIndexOf("/")+1);     req=(HttpWebRequest)WebRequest.Create(this.url);
if(this.position>0)
req.AddRange(this.position-1);
res=(HttpWebResponse)req.GetResponse();
stm=res.GetResponseStream();
fw=new FileStream(saveFolder+fileName,FileMode.Open,FileAccess.Write,FileShare.Write);
fw.Seek(this.position,SeekOrigin.Begin);
byte[] buffer=new byte[4096];
read=stm.Read(buffer,0,buffer.Length);
total+=read;
fw.Write(buffer,0,read);
while(total<this.length)
{
read=stm.Read(buffer,0,buffer.Length);
if(read<=(this.length-total))
{
fw.Write(buffer,0,read);
total+=read;
}
else
{
for(int i=0;i<(this.length-total);i++)
{
fw.WriteByte(buffer[i]);
total+=(this.length-total);
}
}
}
res.Close();
fw.Flush();
fw.Close();
                            return total;
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if(res!=null)
res.Close();
if(fw!=null)
fw.Close();
}
}
}
}
下载一个文件,url=http://db.kingsoft.com/download/othertools/TrojanDetector.EXEbutton1_Click()
{
   HttpDown d=new HttpDown(10,100000,@"g:\temp\",url);
   this.Text=( d.DoDownload() ).ToString();
}

解决方案 »

  1.   

    我是在下载前先建立一个总长度的空白文件,然后移动文件指针的 ,
    public static void CreateBlankFile(long length,int blocks,string fileFullPath)
    {
    int length1,length2;
    length1=(int)length/blocks;
    length2=(int)length%blocks;
    FileStream fs=new FileStream(fileFullPath,FileMode.Create);
    byte [] writeBytes=new byte[length1];
    // add the fileWritePosition and the bolckLength of each block
    for(int i=0;i<blocks;i++)
    fs.Write(writeBytes,0,length1);
    if(length1>0)
    fs.Write(new byte[length2],0,length2);
    fs.Flush();
    fs.Close(); }