forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Автоапдейтер. (http://forum.boolean.name/showthread.php?t=17479)

Lestar 05.11.2012 00:17

Автоапдейтер.
 
Стоит задача написать автопдейтер приложения. Проверили версию, скачали патч, пропатчили приложение. Вызывает вопрос обновления приложения. Я так понимаю мы будем работаем с бинарными данными. Вопрос заключается в том, что файл ресурсов мы имеем размером 400 метров например, но нам необходимо заменить лишь часть ресурсов из него. Каким образом их вычленить из общей массы? Буду благодарен за линки что то почитать, так как недопонимаю что именно гуглить.

UP1. Единственная мысль приходит это предварительно сравнивать старый и новый файлы ресурсов побайтово и получить коллекцию байтов с индексами, которые нужно заменить.
Up2. Но при подобной реализации встает вопрос, если в новом ресурсе изменения окажутся в начале массива, то после чтения из потока данных и их сравнения, получим коллекцию байтов для обновления, почти соответствующую по размеру файлу ресурсов, что не есть правильно.

moka 05.11.2012 02:17

Ответ: Автоапдейтер.
 
Если хранятся данные в файле ресурсов, то у тебя должна быть нормальная архитектура для хранения данных и индексирования адресов к данным, эдакий XML (например) заголовок, со списком данных, иерархией и т.п.
Далее если это есть, то ты будешь работать с хранилищем данных как с обыкновенной файловой системой.
Есть версии, каждая версия содержит информацию о изменениях, также есть ключевые версии, например каждая 8мая, которая имеет полный список файлов. Ключевые версии - обычно это версия которую качаешь с сайта когда качаешь полную игру. Получается что версию на сайте прийдётся обновлять не каждую версию, а лишь каждую 8ую, или сколько ты захочешь.
Далее зная текущую версию и разницу версий, находим все патчи, и затем создаём такой же xml со списком файлов, начиная со старых патчей к новым, чтобы если обновился дважды один и тот же файл, старый в итоге перезаписался новым. Когда имеем полный список, передаём данные клиенту (этот xml), и он начинает запрашивать сервер файлы по списку.
При этом если клиент не допатчился и закрыл приложение, затем пришёл позже, а там уже новый патч, то ему присылается лишь заголовки между той которую он не закончил и новым патчем, и клиент у себя уже дополняет свой патч файл (заголовки) так чтобы он был полным.
Каждый файл должен иметь также номер версии с которой он был закачан (к обновлению которому принадлежит).
Зачем это нужно?
Представь у тебя файл ресурсов с огромным заголовком тысяч файлов.
И тут ты напортачил и патч не работает. Делаем hard repair. Сервер выдаёт полный файл заголовок со списком всех файлов а также их версий. Клиент пробегается по своему списку файлов, сверяет версии, если есть расхождение вносит файл с расхождением и версию в временный заголовочный файл для последующего запроса.
После Repair'а при наличии расхождений, запросит у сервера файлы для обновления.

По сути тебе нужно разбить на явные и конкретные стадии патчинг, учитывая ВСЕ сценарии и возможность жёсткой починки.
Как заметил патчинг такого рода требует хорошую файловую систему ресурсов, без неё будет сложно реализовать хорошую систему.

Не думаю что на эту тему есть какие-то конкретные решения, т.к. оно очень зависит от специфики проекта и кучи факторов, следственно зная общие представления и задачи - тебе нужно разработать эту систему самостоятельно.


Часовой пояс GMT +4, время: 11:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot