我用以下的方法,可是我测试过,跟踪文件段的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();
}
请高人抽空看下,小弟不胜感激啊!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();
}
解决方案 »
- 关于自定义winform 按钮事件,重复问题
- C#网页源码下载,用谷歌搜索图片,怎么获取不到图片部分的源码啊?
- DATAGRIDVIEW 怎么绑定不了数据?
- 怎么把多线程中的参数传出啊?
- 英文论坛博客
- <%# %> <%$%><%@ %>这三个是什么东西????
- 请问各兄弟,密码保存到哪里比较合适
- DotNetSkin1.20.1报错。高手快来看看啊
- 大家好,如果从上海请一位精通C/S 及 B/S等分布式企业级计算程序的分析及架构师或者相当有经验的人员,年龄在35岁以上,年薪大约需要多少?!
- 需要C#的公司,是否兼收VB.net的程序员?
- 如何使多个线程同时访问文件,而不出现拒绝?
- 如何将服务器的元组信息和数据分离(http1.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(); }