一个下载文件的函数,程序求教

我看你有戏 2009-12-27 08:53:06


/// <summary>
/// 下载文件函数
/// </summary>
/// <param name="url">文件地址</param>
/// <param name="sSaveDir">保存下载文件的目录</param>
/// <returns>是否成功</returns>
public static bool StartDownload(string url,string sSaveDir,string sFileName)
{
string LocalPath = sSaveDir +"\\"+ sFileName;

if (Directory.Exists(sSaveDir)==false)
{
Directory.CreateDirectory(sSaveDir);
}

try
{
Uri u = new Uri(url);
HttpWebRequest mRequest = (HttpWebRequest)WebRequest.Create(u);
mRequest.Method = "GET";
mRequest.ContentType = "application/x-www-form-urlencoded";
mRequest.Timeout = 30000;

HttpWebResponse wr = (HttpWebResponse)mRequest.GetResponse();

Stream sIn = wr.GetResponseStream();
FileStream fs = new FileStream(LocalPath, FileMode.Create, FileAccess.Write);

long length = wr.ContentLength;
long i = 0;
decimal j=0;
int nReadLen = 0 ;

while (i < length)
{
byte[] buffer = new byte[1024];
nReadLen = sIn.Read(buffer, 0, buffer.Length);
if (nReadLen<1024)
{
Console.WriteLine("读取的数据为"+nReadLen+"个字节!!!");
}
i += nReadLen;
fs.Write(buffer, 0, nReadLen );

if((i % 1024)==0)
{
j=Math.Round(Convert.ToDecimal((Convert.ToDouble(i)/Convert.ToDouble(length))*100),4);
Console.WriteLine("当前下载文件大小:"+length.ToString()+"字节 当前下载大小:"+i+"字节 下载进度"+j.ToString()+"%");

}
else
{
Console.WriteLine("当前下载文件大小:"+length.ToString()+"字节 当前下载大小:"+i+"字节");
}

}

sIn.Close();
wr.Close();
fs.Close();
return true;
}
catch(System.Exception ex)
{
Console.WriteLine(ex.Message);
HJG.HJGClass.LogTxt("文件地址:\t"+url+ex.Message,true);
return false;
}
}



以上代码中mRequest.Timeout = 30000;

这个参数的含义是不是说如果超过30秒钟,文件没有下载完就抛出异常吗,函数就返回吗

实际操作过程中发现有些图片文件只下载了1k不到,图片不能正常显示,但是函数返回了为true
...全文
101 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
我看你有戏 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]
Timeout 是进行后续同步请求时使用 GetResponse 方法等待响应以及 GetRequestStream 方法等待流所允许的毫秒数。如果资源在超时期限内未返回,请求将引发 WebException,并将 Status 属性设置为 WebExceptionStatus..::.Timeout。

public bool downfile(string url,string LocalPath)
  {
  try
  {
    Uri u = new Uri(url);
    HttpWebRequest mRequest = (HttpWebRequest)WebRequest.Create(u);
    mRequest.Method = "GET";
    mRequest.ContentType = "application/x-www-form-urlencoded";
    HttpWebResponse wr = (HttpWebResponse)mRequest.GetResponse();
    Stream sIn = wr.GetResponseStream();
    FileStream fs = new FileStream(LocalPath, FileMode.Create, FileAccess.Write);
    long length = wr.ContentLength;
    int i = 0;   
    long j=0;
    byte[] buffer = new byte[1024];
    while ((i = sIn.Read(buffer, 0, buffer.Length)) > 0)
    {
    j+=i;   
    fs.Write(buffer, 0,i);
    }
    sIn.Close();
    wr.Close();
    fs.Close();
    return true;
  }
  catch { return false; }

}
[/Quote]

timeout没有的话
假如我请求的资源部存在,网络连接超时
那函数多久才会返回啊
我看你有戏 2009-12-28
  • 打赏
  • 举报
回复

是不是可以这样理解

30秒内如果连接不上我想请求的资源,那么就会抛出异常
one2zero 2009-12-28
  • 打赏
  • 举报
回复
另外 timeout 只是响应时间
只要没有设置的过小 应该没有问题的
one2zero 2009-12-28
  • 打赏
  • 举报
回复
byte[] buffer = new byte[1024];

难道你这句不是为了 限制大小为1024?
如果不是的话 不妨 换个大小试试
我看你有戏 2009-12-27
  • 打赏
  • 举报
回复
大哥timeout怎么没了啊
wuyq11 2009-12-27
  • 打赏
  • 举报
回复
Timeout 是进行后续同步请求时使用 GetResponse 方法等待响应以及 GetRequestStream 方法等待流所允许的毫秒数。如果资源在超时期限内未返回,请求将引发 WebException,并将 Status 属性设置为 WebExceptionStatus..::.Timeout。

public bool downfile(string url,string LocalPath)
{
try
{
Uri u = new Uri(url);
HttpWebRequest mRequest = (HttpWebRequest)WebRequest.Create(u);
mRequest.Method = "GET";
mRequest.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse wr = (HttpWebResponse)mRequest.GetResponse();
Stream sIn = wr.GetResponseStream();
FileStream fs = new FileStream(LocalPath, FileMode.Create, FileAccess.Write);
long length = wr.ContentLength;
int i = 0;
long j=0;
byte[] buffer = new byte[1024];
while ((i = sIn.Read(buffer, 0, buffer.Length)) > 0)
{
j+=i;
fs.Write(buffer, 0,i);
}
sIn.Close();
wr.Close();
fs.Close();
return true;
}
catch { return false; }

}
yulinlover 2009-12-27
  • 打赏
  • 举报
回复
个人意见:Content-Type设置要和下载的文件格式相匹配吧?
顺便帮顶

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧