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