/// <summary> /// Download image /// </summary> /// <param name="url"></param> /// <param name="referer"></param> /// <param name="filename"></param> /// <param name="progressChanged"></param> /// <returns></returns> public string Download(string url, string referer, string filename, Action<string> progressChanged, CancellationToken cancelToken) { String message = ""; checkOverwrite(filename, progressChanged, ref message); ExtendedWebClient client = new ExtendedWebClient(); client.Referer = referer; var tempFilename = DeleteTempFile(filename, progressChanged); Util.CreateSubDir(tempFilename); int retry = 1; while (retry <= Properties.Settings.Default.RetryCount) { try { using (var stream = client.OpenRead(url)) { Int64 bytes_total = downloadPreCheck(filename, client, progressChanged, ref message); using (var f = File.Create(tempFilename)) { stream.CopyTo(f); } downloadPostCheck(filename, tempFilename, bytes_total, progressChanged, ref message); } break; } catch (NijieException) { throw; } catch (Exception ex) { checkHttpStatusCode(url, ex); Log.Warn(string.Format("Error when downloading: {0} to {1} ==> {2}, Retrying {2} of {3}...", url, tempFilename, ex.Message, retry, Properties.Settings.Default.RetryCount)); DeleteTempFile(filename, progressChanged); var prefixMsg = message.Clone(); for (int i = 0; i < Properties.Settings.Default.RetryDelay; ++i) { message = String.Format("{0} waiting: {1}", prefixMsg, i); Thread.Sleep(1000); if (cancelToken != null && cancelToken.IsCancellationRequested) { throw new NijieException(string.Format("Cancel requested, error when downloading: {0} to {1} ==> {2}", url, tempFilename, ex.Message), ex, NijieException.DOWNLOAD_CANCELLED); } } ++retry; if (retry > Properties.Settings.Default.RetryCount) throw new NijieException(string.Format("Error when downloading: {0} to {1} ==> {2}", url, tempFilename, ex.Message), ex, NijieException.DOWNLOAD_UNKNOWN_ERROR); } } Thread.Sleep(100); // delay before renaming File.Move(tempFilename, filename); message = "Saved to: " + filename; if (progressChanged != null) progressChanged(message); return message; }