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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2015, 20:00   #1
6stprod
Пользователь
 
Регистрация: 24.01.2015
Сообщений: 10
По умолчанию Докачка файла

у меня есть temp папка, в которую предварительно скачиваются файлы, прежде чем попасть в основную дирректорию.
При разрыве соединения в папке темп остается недокачаный(ые) файлы, подскажите как их докачать?

(Моя логика: найти все файлы *mpq в папке temp, проверить их с патчлистом на сервере, если есть недокачанный файл то докачать с последнего байта, на котором был разрыв, после всего этого файлы перемещаются в основную дирректорию)
Код:
for (int i = 0; i < patch.UpdateFiles.Length; i++)
                {
                    UpdateFile updateFile = patch.UpdateFiles[i];
 
                    string tempFile = Path.Combine(TempFolder, updateFile.FileName);
 
                    if (matchingFiles.ContainsKey(updateFile.FileName))
                    {
                        FileInfo file = matchingFiles[updateFile.FileName];
                        string localFileHash = HashHelper.GetMD5HashOfFile(file.FullName);
                        if (localFileHash == updateFile.Hash)
                        {
                            //то к сумме скачанных байтов добавляем его размер, 
                            //чтобы далее правильно считался прогресс выполнения скачивания в процентах
                            downloadedBytesLength += updateFile.FileSize;
                            lastPercentValue = UpdateProgress(downloadedBytesLength, patch.PatchLength, lastPercentValue);
                            continue; //выходим из текущей итерации цикла и цикл переходит к следующей
                        }
                    }
                    long offset = 0L;
                    //Если файл существует и скачан полностью
                    if (File.Exists(tempFile))
                    {
                        string hash = HashHelper.GetMD5HashOfFile(tempFile);
                        if (hash == updateFile.Hash) //сверяем хэши
                        {
                            //то к сумме скачанных байтов добавляем его размер, 
                            downloadedBytesLength += updateFile.FileSize;
                            downloaded.Add(Tuple.Create(tempFile, updateFile));
                            lastPercentValue = UpdateProgress(downloadedBytesLength, patch.PatchLength, lastPercentValue);
                            continue;
                        }
                        else
                        {
                            var fileInfo = new FileInfo(tempFile);
                            offset = fileInfo.Length; На сколько надо сдвинуть при скачивании.
                            downloadedBytesLength += fileInfo.Length; //теперь прогресс будет правильно считаться
                           
                        }
                    }
                    Uri url = new Uri(UrlHelper.Combine(_serverFilesRoot, updateFile.FileName));
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        Stream source = response.GetResponseStream();
                        if (source != null)
                        {
                            byte[] buffer = new byte[102400]; //102400 байт = 100 Килобайт
                            using (FileStream fs = new FileStream(tempFile, FileMode.OpenOrCreate, FileAccess.Write))//File.Create(tempFile))
                            {
                                int readed;
 
                                do
                                {
                                    if (offset > 0L) //L - значит, что литерал 0 типа long или Int64, что одно и тоже. Без L будет типа int.
                                    {
                                        source.Seek(offset, SeekOrigin.Begin); //сдвигаем место, откуда начнём читать
                                    }
                                    readed = source.Read(buffer, 0, buffer.Length);
                                    int lenght = readed == buffer.Length ? buffer.Length : readed;
                                    if (lenght == 0)
                                        break;
 
                                    fs.Write(buffer, 0, lenght);
                                    downloadedBytesLength += readed;
                                    lastPercentValue = UpdateProgress(downloadedBytesLength, patch.PatchLength, lastPercentValue);
                                } while (readed > 0);
                            }
 
                            downloaded.Add(Tuple.Create(tempFile, updateFile));
                        }
                    }
                }
на этом месте ошибка "Потом не содержит операций поиска"
Код:
	
source.Seek(offset, SeekOrigin.Begin);
прикрепил файл Updater.cs
Вложения
Тип файла: rar WowUpdater.rar (4.7 Кб, 8 просмотров)
6stprod вне форума Ответить с цитированием
Старый 27.08.2015, 12:52   #2
6stprod
Пользователь
 
Регистрация: 24.01.2015
Сообщений: 10
По умолчанию

Вопрос решен
6stprod вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Докачка файла Stas_Godfrey C# (си шарп) 1 01.04.2014 14:33
Докачка файла idhttp Terikon Работа с сетью в Delphi 7 20.05.2012 21:31
Закачка-докачка файла в потоке, с прогрессом Alter Работа с сетью в Delphi 2 13.01.2011 12:06
скачка и докачка файла krok PHP 5 31.10.2009 22:22