桌面应用程序的通用自动更新

桌面应用程序的通用自动更新

是否有一个应用程序可以默默更新包含 Web 目录中所有文件的本地文件夹?或者更好的是,如果有一个 .zip 文件,它会将文件提取到指定的文件夹中?

我在本地文件夹中有一个简单的桌面 Web 应用程序(使用 jQuery 的 HTML/Javascript),每当它更新时,我希望办公室中的计算机通过自动下载“latest.zip”之类的文件(通过 HTTP 下载,而不是 FTP 下载)来自动安装更新,并让更新程序将文件复制到应用程序目录中。

我一直在搜索,但我看到的都是双向文件同步和太复杂或太重的程序。我的目标是能够以极少的用户交互静默更新应用程序目录。但由于 JavaScript 无法写入硬盘,因此需要使用另一个将定期运行的应用程序(exe 文件)来完成。

也许存在类似通用更新程序的东西,您可以在其中放置文件的网址和应该复制文件的本地目录?

答案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),请查看System.Security.Cryptography 命名空间

然后,脚本检查目标文件夹中是否存在旧更新文件,并计算其 MD5 哈希值。

接下来,比较两个哈希值。如果不相等,则表示已更新。然后,脚本使用 Windows Shell 对象将更新文件复制到目标文件夹并提取其内容。数字 20 是 CopyHere() 函数的两个选项的总和 - 4(抑制进度对话框)和 16(对任何对话框回答“全部是”,从而自动覆盖现有文件)。

最后,最后一行从临时目录中删除下载的更新文件。


参考

有关所使用的类、方法和 cmdlet 的详细信息,请参阅以下链接:

答案2

我发现的问题是,您的客户端计算机无法访问您的本地文件夹,因此他们无法知道时间。如果文件夹很小,您可以让它每隔一段时间自动下载一个新副本,或者制作一个 shell/bash 脚本供他们启动它,每次打开时都会检查并下载新版本。

如果它有用,如果您使用的是 Windows,请查看 FreeFileSync 附带的 RealtimeSync 应用程序,您可以将其设置为监视文件夹的变化,然后在发现变化时让它执行命令 - 例如批处理脚本将它们上传到其他机器下载。

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

相关内容