예제 #1
0
            public static DownloadData Create(string url, string destFolder, 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);

                // Take the name of the file given to use from the web server.
                String fileName = System.IO.Path.GetFileName(downloadData.response.ResponseUri.ToString());

                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);
            }