Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2014, 23:49   #1
Stas_Godfrey
Новичок
Джуниор
 
Регистрация: 15.03.2013
Сообщений: 1
По умолчанию Докачка файла

Доброго времени суток. Есть следующая функция
Код:
async Task DownloadFile(string sSourceURL, string sDestinationPath)
        {
            if (!IsConnect())
            {
                MessageBox.Show("Загрузка невозможна.\nОтсуствует соединение с сетью.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (!Directory.Exists(AppData + "/GameWorld")) Directory.CreateDirectory(AppData + "/GameWorld");
            string downloadFileName = System.IO.Path.GetFileName(sSourceURL);
            DlBox.Visible = true;
            DnInfo.Text += "0%";
            DlBox.Text = "Загрузка: " + downloadFileName;
            Downloading = true;

            long iFileSize;
            int iBufferSize = 1024;
            iBufferSize *= 1000;
            long iExistLen = 0;
            int iByteSize;
            byte[] downBuffer = new byte[iBufferSize];
            double PercentState = 0;
            
            if (System.IO.File.Exists(sDestinationPath))
            {
                System.IO.FileInfo fINfo = new System.IO.FileInfo(sDestinationPath);
                iExistLen = fINfo.Length; // Размер текущего файла в байтах
            }

            if (iExistLen > 0)
                saveFileStream = new System.IO.FileStream(sDestinationPath, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);
            else
                saveFileStream = new System.IO.FileStream(sDestinationPath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);

            System.Net.HttpWebRequest hwRq;
            System.Net.HttpWebResponse hwRes;
            hwRq = (System.Net.HttpWebRequest) System.Net.HttpWebRequest.Create(sSourceURL);
            hwRq.AddRange((int)iExistLen); // с какого байта начинаем грузить
            System.IO.Stream smRespStream;
            hwRes = (System.Net.HttpWebResponse) hwRq.GetResponse();
            smRespStream = hwRes.GetResponseStream();
            iFileSize = hwRes.ContentLength;
            
            while ((iByteSize = await smRespStream.ReadAsync(downBuffer, 0, downBuffer.Length)) > 0)
            {
                saveFileStream.WriteAsync(downBuffer, 0, iByteSize);
                PercentState = Math.Round((double)saveFileStream.Length / iFileSize * 100, 0);
                DnInfo.Text = "Выполняется загрузка: " + PercentState + "% " + "(" + Math.Round((double)saveFileStream.Length / 1024 / 1024, 1) + " МБ / " + Math.Round((double)iFileSize / 1024 / 1024, 1) + " МБ)";
                Download.Value = (int)PercentState;
            } 
            MessageBox.Show("Загрузка успешно завершена!", "Файл загружен", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            lblStatus.Text = "Готово к установке";
            lblStatus.ForeColor = Color.Green;
            if (!rbGameComp.Checked)
            {
                btnInstall.Enabled = true;
                btnDelete.Enabled = true;
            }
            Download.Value = 0;
            DnInfo.Text = "Выполняется загрузка:";
            DlBox.Visible = false;
            Downloading = false;
            saveFileStream.Close();
        }
Возможность докачки файла из интернета.
Если качать файл без прерываний - всё нормально скачается. Если же останавливать загрузку и возобновлять - файл не будет докачан правильно (MessageBox об успешном завершении не выдаётся).
Остановку загрузки делаю методом saveFileStream.Close();
Хотелось бы узнать, в чём проблема?
Stas_Godfrey вне форума Ответить с цитированием
Старый 01.04.2014, 14:33   #2
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Непонятно почему Вы не используете await в строке
"saveFileStream.WriteAsync(downBuff er, 0, iByteSize);"

Так же после вызова "saveFileStream.Close();" у Вас обязаны появится ошибки при вызовах
"saveFileStream.WriteAsync(downBuff er, 0, iByteSize);"
"saveFileStream.Length"
simples вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Докачка файла idhttp Terikon Работа с сетью в Delphi 7 20.05.2012 21:31
Закачка-докачка файла в потоке, с прогрессом Alter Работа с сетью в Delphi 2 13.01.2011 12:06
WinInet докачка файла через TFileStream Человек_Борща Работа с сетью в Delphi 11 16.08.2010 17:31
скачка и докачка файла krok PHP 5 31.10.2009 22:22