/// <summary> /// 下载完成 /// </summary> private void DownloadFileOk(string localfileReal, string localfileWithSuffix) { try { //去掉.downloading后缀 FileInfo fi = new FileInfo(localfileWithSuffix); fi.MoveTo(localfileReal); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { //通知完成 ShowDownloadPercent?.Invoke(100); } }
/// <summary> /// Http方式下载文件 /// </summary> /// <param name="url">http地址</param> /// <param name="localfile">本地文件</param> /// <returns>错误码</returns> public int DownloadFile(string url, string localfile) { int ret = 0; string localfileReal = localfile; string localfileWithSuffix = localfileReal + Suffix; try { long startPosition = 0; FileStream writeStream = null; if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(localfileReal)) { return(1); } //取得远程文件长度 long remoteFileLength = GetHttpLength(url); if (remoteFileLength == 0) { return(2); } if (File.Exists(localfileReal)) { return(0); } //判断要下载的文件是否存在 if (File.Exists(localfileWithSuffix)) { writeStream = File.OpenWrite(localfileWithSuffix); startPosition = writeStream.Length; if (startPosition > remoteFileLength) { writeStream.Close(); File.Delete(localfileWithSuffix); writeStream = new FileStream(localfileWithSuffix, FileMode.Create); } else if (startPosition == remoteFileLength) { DownloadFileOk(localfileReal, localfileWithSuffix); writeStream.Close(); return(0); } else { writeStream.Seek(startPosition, SeekOrigin.Begin); } } else { writeStream = new FileStream(localfileWithSuffix, FileMode.Create); } HttpWebRequest req = null; HttpWebResponse rsp = null; try { req = (HttpWebRequest)HttpWebRequest.Create(url); if (startPosition > 0) { req.AddRange((int)startPosition); } rsp = (HttpWebResponse)req.GetResponse(); using (Stream readStream = rsp.GetResponseStream()) { byte[] btArray = new byte[ByteSize]; long currPostion = startPosition; int contentSize = 0; while ((contentSize = readStream.Read(btArray, 0, btArray.Length)) > 0) { writeStream.Write(btArray, 0, contentSize); currPostion += contentSize; ShowDownloadPercent?.Invoke((int)(currPostion * 100 / remoteFileLength)); } } } catch (Exception ex) { Console.WriteLine("获取远程文件失败!exception:\n" + ex.ToString()); ret = 3; } finally { if (writeStream != null) { writeStream.Close(); } if (rsp != null) { rsp.Close(); } if (req != null) { req.Abort(); } if (ret == 0) { DownloadFileOk(localfileReal, localfileWithSuffix); } } } catch (Exception ex) { Console.WriteLine("获取远程文件失败!exception:\n" + ex.ToString()); ret = 4; } return(ret); }