加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
update.rb 3.68 KB
一键复制 编辑 原始数据 按行查看 历史
redouble 提交于 2016-08-01 12:06 . 修正比较版本BUG
# encoding: utf-8
require 'fileutils'
require 'nokogiri'
require 'open-uri'
require "win32ole"
require "zip"
def download_file(fileName, uri)
data = open(uri, 'User-Agent' => 'ruby'){|f| f.read}
file = File.new fileName, 'w+'
file.binmode
file << data
file.flush
file.close
end
def main
# 解析XML文件,获得更新地址
if !File.exist?("UpdateSet.xml")
puts "本地自动更新配置文件不存在,请检查您的采客程序是否已经损坏?"
return false
end
puts "比较服务器版本……"
doc = File.open("UpdateSet.xml") { |f| Nokogiri::XML(f) }
current_version = doc.xpath("//Version").text
# 获得更新地址
download_uri = doc.xpath("//UpdateURL").text
# 获得当前软件在系统中进程名
proc_name = doc.xpath("//AppName").text
(proc_name = proc_name + '.exe') if !proc_name.include?('.')
# 获得更新的文件在本地存放的临时路径
temp_dir = doc.xpath("//TempFile").text
(temp_dir = "update_temp") if temp_dir.nil? || temp_dir.strip == ""
puts "临时文件目录:" + temp_dir
FileUtils.remove_dir(temp_dir, true)
FileUtils.mkdir_p(temp_dir)
FileUtils.mkdir_p(File.join(temp_dir, 'to_be_copy'))
download_file(File.join(temp_dir, "update.xml"), download_uri)
doc2 = File.open(File.join(temp_dir, "update.xml") ) { |f| Nokogiri::XML(f) }
new_version = doc2.xpath("//Version").text
if current_version >= new_version
puts "目前已经是最新版本了!"
return false
else
# 下载文件列表
puts "正在准备需要下载更新的文件……"
file_source = doc2.xpath("//filelist")[0]["sourcepath"]
file_list = doc2.xpath("//file")
file_list.each do |f|
puts "正在下载:#{f["name"]}"
download_file File.join(temp_dir, f["name"]), File.join(file_source, f["name"])
# 如果是普通文件,则COPY到to_be_copy文件夹
# 如果是需要解压缩的文件,则解压缩到to_be_copy文件夹
if f["need_express"] && f["need_express"] == "1"
Zip::File.open(File.join(temp_dir, f["name"])) do |zip_file|
# Handle entries one by one
zip_file.each do |entry|
# Extract to file/directory/symlink
puts "解压缩:" + entry.name #.encoding
entry.extract(File.join(temp_dir, "to_be_copy", entry.name))
end
end
else
FileUtils.cp(File.join(temp_dir, f["name"]), File.join(temp_dir, "to_be_copy", f["name"]) )
end
end
# 杀死windows进程
mgmt = WIN32OLE.connect('winmgmts:\\\\.')
mgmt.ExecQuery("SELECT * FROM Win32_Process WHERE Name ='#{proc_name}'").each do |item|
item.Terminate()
end
# 复制更新下载的文件
puts "复制更新的文件……"
# 直接COPY整个to_be_copy文件夹
FileUtils.cp_r(File.join(temp_dir, "to_be_copy/."), "./")
# 删除需要删除的文件
filedelete = doc2.xpath("//filedelete")
filedelete.each do |fd|
puts "删除文件:" + fd["name"]
begin
FileUtils.remove_entry(fd["name"])
rescue
puts "警告!删除该文件错误:" + fd["name"]
end
end
puts "采客财务数据采集工具已经更新完毕。"
# 显示更新信息
puts '*'*40
content = doc2.xpath("//updateContent")
content.children.each do |c|
c.children.each{ |cc| (puts cc.text) if !cc.nil? && cc.text.strip != "" }
end
puts '*'*40
end
# 删除临时文件夹
FileUtils.remove_dir(temp_dir, true)
return true
end
main
puts "请键入【回车】关闭这个窗口。"
gets
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化