private static async Task <string> DownloadBinariesAsync( string downloadUrl, CancellationToken cancellationToken = default(CancellationToken) ) { // FIXME: 표준 출력(stdout)으로 출력하고 있기 때문에, 커맨드라인 인자등을 추가해서 출력을 제어해야합니다. using var progress = new DownloadProgress(downloadUrl); return(await Downloader.DownloadFileAsync(downloadUrl, progress, cancellationToken)); }
/// <summary>Первоначальная проверка наличия необходимости запуска процедуры обновления /// с последующим запуском обновления</summary> public void StartDownload(ref bool breaked) { try { if (FilesForUpdate.Count == 0) { if (!IsNeedUpdate()) { return; } } var filesManager = new FilesManager(_connectionString); var clientVersionManager = new ClientVersionManager(_xmlFileName); long totalSize = 0; FilesForUpdate.ForEach(fileInfo => totalSize += fileInfo.FileSize); var progressForm = new frmProgress((int)totalSize); progressForm.Show(); progressForm.BringToFront(); var downloadProgress = new DownloadProgress(totalSize); downloadProgress.ProgressChanged += (sender, e) => progressForm.Tick(e.ChangeSize, string.Format("{0,3:#.#}/{1,3:#.#} MБ ({2})", (decimal)downloadProgress.DownloadedSize / BytesInMegabyte, (decimal)downloadProgress.TotalSize / BytesInMegabyte, downloadProgress.CurrentFileName)); foreach (FileInfo fileInfo in FilesForUpdate) { try { downloadProgress.SetCurrentFileName(fileInfo.FileName); filesManager.Download(fileInfo.FileName, downloadProgress); clientVersionManager.SetVersion(fileInfo.FileName, fileInfo.ServerVersion); if (progressForm.FormKeyCode == Keys.Escape) { breaked = true; break; } } catch (Exception) { progressForm.Fail(); throw; } } progressForm.Close(); } catch (Exception exception) { string _errorMessage = string.Format("Ошибка. {0}{1}{2}", exception.Message, Environment.NewLine, exception.StackTrace); MessageBox.Show("Ошибка запуска приложения:\r\n", _errorMessage); } }
/// <summary> /// Загрузка файла из БД и сохранение под другим именем /// </summary> /// <param name="fileName">Файл для загрузки из БД</param> /// <param name="fullFileName">Полный путь и имя файла для сохранения</param> private void Download(String fileName, String fullFileName, DownloadProgress progress) { SqlConnection connection = MiscFunction.OpenConnection(_connectionString); var strSql = "SELECT binaryData FROM Srv_ProgramFile WHERE name = '" + MiscFunction.GetFileName(fileName) + "'"; var cmd = new SqlCommand(strSql, connection); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); reader.Read(); var fs = new FileStream(fullFileName, FileMode.Create, FileAccess.Write); var writer = new BinaryWriter(fs); int startIndex = 0; const int bufferSize = 1000; var outByte = new byte[bufferSize]; long retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize); while (retval == bufferSize) { writer.Write(outByte); writer.Flush(); startIndex += bufferSize; retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize); progress.InicrementDownloadedSize((int)retval); } writer.Write(outByte, 0, (int)retval); writer.Flush(); writer.Close(); fs.Close(); reader.Close(); connection.Close(); }
private void _cmdInLoad_Click(object sender, EventArgs e) { String connString; connString = ConfigurationSettings.AppSettings["ConnectionString"]; String versionStorageName; versionStorageName = ConfigurationSettings.AppSettings["VersionStorage"]; SqlConnection cnn = MiscFunction.OpenConnection(connString); const string sqlStr = "SELECT idFile, version, name, DATALENGTH(binaryData) AS fileSize FROM Srv_ProgramFile"; var cmd = new SqlCommand(sqlStr, cnn); SqlDataReader sdr = cmd.ExecuteReader(); int version = sdr.GetOrdinal("version"); int fileName = sdr.GetOrdinal("name"); int fileSize = sdr.GetOrdinal("fileSize"); var clientVersionManager = new ClientVersionManager(versionStorageName); FilesForLoad.Clear(); while (sdr.Read()) { var fileInfo = new FileInfo(sdr.GetString(fileName), clientVersionManager.GetVersion(sdr.GetString(fileName)), sdr.GetInt32(version), sdr.GetInt32(fileSize)); if (fileInfo.NeedUpdate) { FilesForLoad.Add(fileInfo); } } sdr.Close(); cnn.Close(); //Вывод в таблицу информации при загрузке файлов из БД using (SqlDataAdapter a = new SqlDataAdapter("SELECT version, name, Date FROM Srv_ProgramFile", cnn)) { SqlCommandBuilder cb = new SqlCommandBuilder(a); DataSet ds = new DataSet(); a.Fill(ds, "Srv_ProgramFile"); dataGridView1.DataSource = ds.Tables[0]; } #region Процесс загрузки try { var filesManager = new FilesManager(connString); var CVManager = new ClientVersionManager(versionStorageName); long totalSize = 0; FilesForLoad.ForEach(fileInfo => totalSize += fileInfo.FileSize); var progressForm = new frmProgress((int)totalSize); progressForm.Show(); progressForm.BringToFront(); var downloadProgress = new DownloadProgress(totalSize); downloadProgress.ProgressChanged += (senders, ex) => progressForm.Tick(ex.ChangeSize, string.Format("{0,3:#.#}/{1,3:#.#} MБ ({2})", (decimal)downloadProgress.DownloadedSize / BytesInMegabyte, (decimal)downloadProgress.TotalSize / BytesInMegabyte, downloadProgress.CurrentFileName)); foreach (FileInfo fileInfo in FilesForLoad) { try { downloadProgress.SetCurrentFileName(fileInfo.FileName); filesManager.Download(fileInfo.FileName, downloadProgress); CVManager.SetVersion(fileInfo.FileName, fileInfo.ServerVersion); } catch (Exception) { progressForm.Fail(); throw; } } progressForm.Close(); } catch (Exception exception) { string _errorMessage = string.Format("Ошибка. {0}{1}{2}", exception.Message, Environment.NewLine, exception.StackTrace); MessageBox.Show("Ошибка запуска приложения:\r\n", _errorMessage); } }
/// <summary> /// Загрузка файла на клиента из БД /// </summary> /// <param name="fileName">Имя файла для загрузки</param> public void Download(String fileName, DownloadProgress progress) { Download(fileName, AppDomain.CurrentDomain.BaseDirectory + @"/" + fileName, progress); }