Exemplo n.º 1
0
        public static DownloadData Create(string url, string destFolder, String fileName, IWebProxy proxy)
        {
            // This is what we will return
            DownloadData downloadData = new DownloadData();

            downloadData.proxy = proxy;

            long urlSize = downloadData.GetFileSize(url);

            downloadData.size = urlSize;

            WebRequest req = downloadData.GetRequest(url);

            try {
                downloadData.response = req.GetResponse();
            }
            catch (Exception e) {
                throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Error downloading \"{0}\": {1}", url, e.Message), e);
            }

            // Check to make sure the response isn't an error. If it is this method
            // will throw exceptions.
            ValidateResponse(downloadData.response, url);

            String downloadTo = Path.Combine(destFolder, fileName);

            // If we don't know how big the file is supposed to be,
            // we can't resume, so delete what we already have if something is on disk already.
            if (!downloadData.IsProgressKnown && File.Exists(downloadTo))
            {
                File.Delete(downloadTo);
            }

            if (downloadData.IsProgressKnown && File.Exists(downloadTo))
            {
                // We only support resuming on http requests
                if (!(downloadData.Response is HttpWebResponse))
                {
                    File.Delete(downloadTo);
                }
                else
                {
                    // Try and start where the file on disk left off
                    downloadData.start = new FileInfo(downloadTo).Length;

                    // If we have a file that's bigger than what is online, then something
                    // strange happened. Delete it and start again.
                    if (downloadData.start > urlSize)
                    {
                        File.Delete(downloadTo);
                    }
                    else if (downloadData.start < urlSize)
                    {
                        // Try and resume by creating a new request with a new start position
                        downloadData.response.Close();
                        req = downloadData.GetRequest(url);
                        ((HttpWebRequest)req).AddRange((int)downloadData.start);
                        downloadData.response = req.GetResponse();

                        if (((HttpWebResponse)downloadData.Response).StatusCode != HttpStatusCode.PartialContent)
                        {
                            // They didn't support our resume request.
                            File.Delete(downloadTo);
                            downloadData.start = 0;
                        }
                    }
                }
            }
            return(downloadData);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Begin downloading the file at the specified url, and save it to the given folder.
        /// </summary>
        private void Download(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            _pause         = false;
            DownloadStatus = DownloadStatus.Downloading;
            DownloadData   = DownloadData.Create(FileUrl, DestinationFolder, this.DestinationFileName, Helper.InitialProxy());
            if (string.IsNullOrEmpty(DestinationFileName))
            {
                Path.GetFileName(DownloadData.Response.ResponseUri.ToString());
            }
            this.downloadingTo = Path.Combine(DestinationFolder, DestinationFileName);
            FileMode mode = DownloadData.StartPoint > 0 ? FileMode.Append : FileMode.OpenOrCreate;

            fileStream = File.Open(downloadingTo, mode, FileAccess.Write);
            byte[] buffer = new byte[DownloadBlockSize];
            totalDownloaded = DownloadData.StartPoint;
            double totalDownloadedInTime = 0;
            long   totalDownloadedTime   = 0;
            bool   callProgress;

            while (true)
            {
                callProgress = true;
                if (worker.CancellationPending)
                {
                    DownloadSpeed = Progress = 0;
                    e.Cancel      = true;
                    break;
                }
                if (_pause)
                {
                    DownloadSpeed  = 0;
                    DownloadStatus = DownloadStatus.Paused;
                    System.Threading.Thread.Sleep(200);
                }
                else
                {
                    DownloadStatus = DownloadStatus.Downloading;
                    long startTime = DateTime.Now.Ticks;
                    int  readCount = DownloadData.DownloadStream.Read(buffer, 0, DownloadBlockSize);
                    if (readCount == 0)
                    {
                        Progress = 100;
                        break;
                    }
                    totalDownloadedInTime += readCount;
                    totalDownloadedTime   += DateTime.Now.Ticks - startTime;
                    if (callProgress = totalDownloadedTime >= SecondTicks)
                    {
                        DownloadSpeed         = (int)(totalDownloadedInTime / TimeSpan.FromTicks(totalDownloadedTime).TotalSeconds);
                        totalDownloadedInTime = 0;
                        totalDownloadedTime   = 0;
                    }
                    totalDownloaded += readCount;
                    fileStream.Write(buffer, 0, readCount);
                    fileStream.Flush();
                }
                Progress = (int)(100.0 * totalDownloaded / DownloadData.FileSize);
                if (callProgress && DownloadData.IsProgressKnown)
                {
                    worker.ReportProgress(Progress);
                }
            }
            worker.ReportProgress(Progress);
        }
Exemplo n.º 3
0
        public static DownloadData Create(string url, string destFolder, String fileName, IWebProxy proxy)
        {
            // This is what we will return
            DownloadData downloadData = new DownloadData();
            downloadData.proxy = proxy;

            long urlSize = downloadData.GetFileSize(url);
            downloadData.size = urlSize;

            WebRequest req = downloadData.GetRequest(url);
            try
            {
                downloadData.response = (WebResponse)req.GetResponse();
            }
            catch (Exception e)
            {
                throw new ArgumentException(String.Format(
                    "Error downloading \"{0}\": {1}", url, e.Message), e);
            }

            // Check to make sure the response isn't an error. If it is this method
            // will throw exceptions.
            ValidateResponse(downloadData.response, url);

            String downloadTo = Path.Combine(destFolder, fileName);

            // If we don't know how big the file is supposed to be,
            // we can't resume, so delete what we already have if something is on disk already.
            if (!downloadData.IsProgressKnown && File.Exists(downloadTo))
                File.Delete(downloadTo);

            if (downloadData.IsProgressKnown && File.Exists(downloadTo))
            {
                // We only support resuming on http requests
                if (!(downloadData.Response is HttpWebResponse))
                {
                    File.Delete(downloadTo);
                }
                else
                {
                    // Try and start where the file on disk left off
                    downloadData.start = new FileInfo(downloadTo).Length;

                    // If we have a file that's bigger than what is online, then something
                    // strange happened. Delete it and start again.
                    if (downloadData.start > urlSize)
                        File.Delete(downloadTo);
                    else if (downloadData.start < urlSize)
                    {
                        // Try and resume by creating a new request with a new start position
                        downloadData.response.Close();
                        req = downloadData.GetRequest(url);
                        ((HttpWebRequest)req).AddRange((int)downloadData.start);
                        downloadData.response = req.GetResponse();

                        if (((HttpWebResponse)downloadData.Response).StatusCode != HttpStatusCode.PartialContent)
                        {
                            // They didn't support our resume request.
                            File.Delete(downloadTo);
                            downloadData.start = 0;
                        }
                    }
                }
            }
            return downloadData;
        }