Пример #1
0
        public static string HttpDownloadFile(string url, string path, UZipProgressDelegate uZipProgress)
        {
            try
            {
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
                String filePath = path.Remove(path.LastIndexOf("\\") + 1);
                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }
                long total = GetFileContentLength(url);

                // 设置参数
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

                //发送请求并获取相应回应数据
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                request.Headers.Add(HttpControl.azHeader, HttpControl.GetFileAutohrization);
                //直到request.GetResponse()程序才开始向目标网页发送Post请求
                Stream responseStream = response.GetResponseStream();
                Console.WriteLine("开始下载流!");

                //创建本地文件写入流
                Stream stream = new FileStream(path, FileMode.Create);
                Console.WriteLine("开始文件流!");
                byte[]   bArr        = new byte[bytebuff];
                int      size        = responseStream.Read(bArr, 0, (int)bArr.Length);
                long     currentSize = 0;
                DateTime messageTime = DateTime.Now;
                while (size > 0)
                {
                    stream.Write(bArr, 0, size);
                    size         = responseStream.Read(bArr, 0, (int)bArr.Length);
                    currentSize += size;
                    var timeSpan = (DateTime.Now - messageTime).TotalMilliseconds;
                    if (timeSpan > 500)
                    {
                        uZipProgress(currentSize, total);
                        messageTime = DateTime.Now;
                    }
                }
                stream.Close();
                Console.WriteLine("关闭文件流!");
                responseStream.Close();
                Console.WriteLine("关闭下载流!");
                uZipProgress(currentSize, total);
            }
            catch (Exception ex)
            {
                String message = ex.Message;
                Console.WriteLine(message);
                throw (ex);
            }
            return(path);
        }
Пример #2
0
 /// <summary>
 /// Zip解压并更新目标文件
 /// </summary>
 /// <param name="ZipFile">Zip压缩包路径</param>
 /// <param name="UnZipDir">解压目标路径</param>
 /// <returns></returns>
 public static bool UnZip2(String ZipFile, String UnZipDir, UZipProgressDelegate uZipProgress)
 {
     try
     {
         UnZipDir = UnZipDir.EndsWith(@"\") ? UnZipDir : UnZipDir + @"\";
         using (var zipfile = ZipHelper.OpenOnFile(ZipFile))
         {
             int total = zipfile.Files.Count();
             int index = 0;
             foreach (var file in zipfile.Files)
             {
                 if (!file.Name.EndsWith("/"))
                 {
                     string FilePath    = UnZipDir + file.Name.Replace("/", @"\"); //设置解压路径
                     string GreatFolder = FilePath.Substring(0, FilePath.LastIndexOf(@"\"));
                     if (!Directory.Exists(GreatFolder))
                     {
                         Directory.CreateDirectory(GreatFolder);
                     }
                     byte[] content = new byte[file.GetStream().Length];
                     file.GetStream().Read(content, 0, content.Length);
                     index++;
                     if (File.Exists(FilePath))                      //跳过相同的文件,否则覆盖更新
                     {
                         if (content.Length == new FileInfo(FilePath).Length)
                         {
                             continue;
                         }
                     }
                     else
                     {
                         File.WriteAllBytes(FilePath, content);
                     }
                     uZipProgress?.Invoke(total, index);
                 }
             }
             uZipProgress?.Invoke(total, index);
         }
         return(true);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
         return(false);
     }
 }
Пример #3
0
        /// <summary>
        /// 下载文件(同步)  支持断点续传
        /// </summary>
        /// <param name="url">文件url</param>
        /// <param name="savepath">本地保存路径</param>
        /// <param name="progress">下载进度(百分比)</param>
        /// <param name="size">下载文件大小</param>
        public static void DowLoadFile(string url, string savepath, UZipProgressDelegate uZipProgress, long size = 0)
        {
            //打开上次下载的文件
            long       lStartPos = 0;
            FileStream fs;

            if (File.Exists(savepath))
            {
                //fs = File.OpenWrite(savepath);
                //lStartPos = fs.Length;
                //fs.Seek(lStartPos, SeekOrigin.Current);//移动文件流中的当前指针
                File.Delete(savepath);
            }

            string direName = Path.GetDirectoryName(savepath);

            if (!Directory.Exists(direName))//如果不存在保存文件夹路径,新建文件夹
            {
                Directory.CreateDirectory(direName);
            }
            fs        = new FileStream(savepath, FileMode.Create);
            lStartPos = 0;

            HttpWebRequest request = null;

            try
            {
                if (size == 0)
                {
                    size = GetFileContentLength(url);
                    if (size < 0)
                    {
                        return;
                    }
                }
                if (size != 0 && size == lStartPos)
                {
                    //下载完成
                    fs.Close();
                    return;
                }

                request = (HttpWebRequest)WebRequest.Create(url);
                request.ReadWriteTimeout = ReadWriteTimeOut;
                request.Timeout          = TimeOutWait;
                request.Headers.Add(HttpControl.azHeader, HttpControl.GetFileAutohrization);
                if (lStartPos > 0)
                {
                    request.AddRange((int)lStartPos);//设置Range值,断点续传
                }
                //向服务器请求,获得服务器回应数据流
                WebResponse respone   = request.GetResponse();
                long        totalSize = respone.ContentLength + lStartPos;
                long        curSize   = lStartPos;

                Stream ns = respone.GetResponseStream();

                byte[] nbytes    = new byte[bytebuff];
                int    nReadSize = 0;
                while (nReadSize < respone.ContentLength)
                {
                    nReadSize = ns.Read(nbytes, 0, bytebuff);
                    fs.Write(nbytes, 0, nReadSize);

                    curSize += nReadSize;
                    //下载进度计算
                    uZipProgress?.Invoke(curSize, totalSize);
                }
                fs.Flush();
                ns.Close();
                fs.Close();
                if (curSize != totalSize)//文件长度不等于下载长度,下载出错
                {
                    throw new Exception();
                }
                if (request != null)
                {
                    request.Abort();
                }
                TryNumDic.Remove(url);
            }
            catch (Exception ex)
            {
                if (request != null)
                {
                    request.Abort();
                }

                fs.Close();
                if (TryNumDic.ContainsKey(url))
                {
                    if (TryNumDic[url] > MaxTryTime)
                    {
                        TryNumDic.Remove(url);
                        throw new Exception();
                    }
                    else
                    {
                        TryNumDic[url]++;
                    }
                }
                else
                {
                    TryNumDic.Add(url, 1);
                }
                //DowLoadFile(url, savepath, uZipProgress,size);
            }
        }