/// <summary>
/// 下载文件,若存在文件,覆盖该文件
/// </summary>
/// <param name="sourceFileUrl"></param>
/// <param name="desFile"></param>
/// <returns></returns>
public static bool DownloadFile(string sourceFileUrl, string desFile)
{
bool flag = false;
long SPosition = 0;
FileStream FStream = null;
Stream myStream = null;
sourceFileUrl = System.Web.HttpUtility.UrlPathEncode(sourceFileUrl);
string tmpFile = desFile + ".tmp";
try
{
if (File.Exists(desFile))
{
File.Delete(desFile);
}
}
catch { }
if (!Directory.Exists(Path.GetDirectoryName(desFile)))
{
Directory.CreateDirectory(Path.GetDirectoryName(desFile));
}
try
{
//判断要下载的文件夹是否存在
if (File.Exists(tmpFile))
{
//打开上次下载的文件
FStream = File.OpenWrite(tmpFile);
//获取已经下载的长度
SPosition = FStream.Length;
long serverFileLength = GetHttpLength(sourceFileUrl);
if (serverFileLength == 0)
return false;
if (SPosition == serverFileLength)
{//文件是完整的,直接结束下载任务
if (FStream != null)
{
FStream.Close();
FStream.Dispose();
}
File.Move(tmpFile, desFile);
return true;
}
FStream.Seek(SPosition, SeekOrigin.Current);
}
else
{
//文件不保存创建一个文件
FStream = new FileStream(tmpFile, FileMode.Create);
SPosition = 0;
}
//打开网络连接
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(sourceFileUrl);
if (SPosition > 0)
{
myRequest.AddRange(SPosition); //设置Range值
}
//向服务器请求,获得服务器的回应数据流
myStream = myRequest.GetResponse().GetResponseStream();
//定义一个字节数据
byte[] btContent = new byte[512];
int intSize = 0;
intSize = myStream.Read(btContent, 0, 512);
while (intSize > 0)
{
FStream.Write(btContent, 0, intSize);
intSize = myStream.Read(btContent, 0, 512);
}
flag = true; //返回true下载成功
}
catch (Exception ex)
{
throw ex;
}
finally
{
//关闭流
if (myStream != null)
{
myStream.Close();
myStream.Dispose();
}
if (FStream != null)
{
FStream.Close();
FStream.Dispose();
}
if (flag)
{
File.Move(tmpFile, desFile);
}
}
return flag;
}
static long GetHttpLength(string url)
{
long length = 0;
try
{
var req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
req.Method = "HEAD";
req.Timeout = 5000;
var res = (HttpWebResponse)req.GetResponse();
if (res.StatusCode == HttpStatusCode.OK)
{
length = res.ContentLength;
}
res.Close();
return length;
}
catch (WebException wex)
{
return 0;
}
}
C# http下载大文件,支持断点下载
最新推荐文章于 2024-04-14 10:20:17 发布