Есть ли приложение, которое будет молча обновлять локальную папку, содержащую все файлы в веб-каталоге? Или даже лучше, если есть файл .zip, он будет извлекать файлы в указанную папку?

У меня есть простое настольное веб-приложение (HTML/Javascript с использованием jQuery) в локальной папке, и всякий раз, когда оно обновляется, я хотел бы, чтобы компьютеры в нашем офисе автоматически устанавливали обновление, автоматически загружая что-то вроде «latest.zip» (через HTTP-загрузку, а не FTP-загрузку), и пусть программа обновления копирует файлы в каталог приложения.

Я искал, но все, что я вижу, это синхронизация файлов, которая является двунаправленной, и программы, которые слишком сложны в использовании или слишком тяжелы. Моя цель - иметь возможность обновлять каталог приложения без вмешательства пользователя. Но так как JavaScript не может писать на жесткие диски, это нужно сделать с помощью другого приложения (exe-файла), которое будет периодически запускаться.

Может быть, есть что-то вроде универсального приложения для обновления, в котором вы можете поместить веб-адрес файлов и локальный каталог, куда файлы должны быть скопированы?

2 ответа2

1

Поскольку в вопросе упоминается файл .exe, я предполагаю, что вы работаете в Windows. Если это так, вы можете сделать это с PowerShell.

Сценарий

# Set some variables to hold the source, name and destination of the update file
$UpdateUrl = "http://example.com/"
$UpdateFile = "update.zip"
$Destination = "C:\Path\to\application\"
$TempDir = $Env:Temp + "\"

# Download the update file to a temporary directory
$Client = New-Object System.Net.WebClient
$Client.DownloadFile($UpdateUrl + $UpdateFile, $TempDir + $UpdateFile)

# Calculate MD5 hash of the downloaded update file
$MD5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$Hash1 = [System.BitConverter]::ToString(
    $MD5.ComputeHash([System.IO.File]::ReadAllBytes($TempDir + $UpdateFile))
)

# If an old update file exists at the destination, calculate its MD5 hash as well
If (Test-Path ($Destination + $UpdateFile)) {
    $Hash2 = [System.BitConverter]::ToString(
        $MD5.ComputeHash([System.IO.File]::ReadAllBytes($Destination + $UpdateFile))
    )
} Else {
    $Hash2 = ""
}

# Compare the MD5 hashes
# If they're not equal, then copy the new update file to the destination and extract its contents
If ($Hash1 -ne $Hash2) {
    Copy-Item ($TempDir + $UpdateFile) $Destination
    $Shell = New-Object -ComObject Shell.Application
    $Shell.NameSpace($Destination).CopyHere(
        $Shell.NameSpace($Destination + $UpdateFile).Items(),
        20
    )
}

# Delete the downloaded update file
Remove-Item ($TempDir + $UpdateFile)

объяснение

Первый блок объявляет некоторые переменные, которые содержат имя, источник и место назначения файла обновления, а также временный каталог для хранения загруженного файла обновления. Не забывайте конечные косые черты, когда вы меняете их на свои собственные пути.

Следующий блок использует объект WebClient для загрузки файла во временный каталог.

Затем скрипт вычисляет хеш MD5 загруженного файла. Если вы хотите вычислить другой хеш, такой как SHA-1, проверьте доступные классы в Системе.Безопасность.Криптографическое пространство имен.

Затем сценарий проверяет наличие старого файла обновления в папке назначения и вычисляет его хэш MD5.

Далее сравниваются два хэша. Если они не равны, значит, произошло обновление. Затем сценарий использует объект оболочки Windows для копирования файла обновления в папку назначения и извлечения его содержимого. Число 20 является суммой двух опций функции CopyHere() - 4 (которая подавляет диалог прогресса) и 16 (который отвечает "Да на все" любым диалогам, таким образом автоматически перезаписывая существующие файлы).

Наконец, последняя строка удаляет загруженный файл обновления из временного каталога.


Рекомендации

Для получения дополнительной информации об используемых классах, методах и командлетах см. Следующие ссылки:

0

Проблема, которую я вижу, состоит в том, что ваши клиентские компьютеры не имеют доступа к вашей локальной папке, поэтому они никак не могут знать, что пора. Если он маленький, вы можете в любом случае сделать так, чтобы он автоматически загружал новую копию так или иначе, или, возможно, создать скрипт shell/bash, который они используют для его запуска, который проверяет и загружает новую версию при каждом открытии.

В случае, если это полезно, если вы в Windows, посмотрите на приложение RealtimeSync, которое поставляется с FreeFileSync, вы устанавливаете его для отслеживания папок на наличие изменений, а затем можете заставить его выполнить команду при обнаружении изменений, таких как пакет скрипт для загрузки их на другие машины для загрузки.

http://sourceforge.net/projects/freefilesync/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .