是否有一个应用程序可以默默更新包含 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 应用程序,您可以将其设置为监视文件夹的变化,然后在发现变化时让它执行命令 - 例如批处理脚本将它们上传到其他机器下载。