Если вы пишете приложение .NET, вы можете рассмотреть возможность использования ClickOnce. Если вам нужно немного настройки, вы можете посмотреть в другом месте.
У нас есть внешний процесс, который выполняет обновление для нас. Когда он находит обновление, он загружает его во вторичную папку и ждет завершения работы основного приложения. При выходе он заменяет все текущие файлы. Основной процесс запускает процесс обновления каждые 4 часа. Поскольку процесс обновления будет ожидать выхода из основного приложения, основное приложение не должно выполнять никакой специальной обработки, кроме запуска приложения обновления.
Это побочная проблема, но если вы планируете написать собственный процесс обновления, я рекомендую вам использовать какое-либо сжатие для (1) сохранения при загрузке и (2) предоставления одного файла для извлечения сервер обновлений.
Надеюсь, что это имеет смысл!