using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
namespace AutoUpdateTool
{
public partial class FormUp : System.Windows.Forms.Form
{
public FormUp()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string filepath = System.Windows.Forms.Application.StartupPath + @"\AIMS.xml";
if (!File.Exists(filepath))
{
MessageBox.Show("AIMS.xml不存在!", "系统提示");
return;
}
string connstr = GetConnStr(filepath);
//if (!dbHelper.CanOpen)
//{
// MessageBox.Show("数据库连接配置不正确,请检查:ConnectionString配置。");
// return;
//}
nowVersion.Text = GetVersion();
upVersion.Text = nowVersion.Text;
}
private void btnLoad_Click(object sender, EventArgs e)
{
string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
if (!File.Exists(localXmlFile))
{
MessageBox.Show("UpdateList.xml不存在!", "系统提示");
return;
}
SetVersion(upVersion.Text);
UpdateListXML(upVersion.Text);
MessageBox.Show("生成成功 可以替换ftp了。", "系统提示");
this.Close();
}
private string GetConnStr(string filepath)
{
XmlOperator xmlOperator = new XmlOperator(filepath);
return xmlOperator.GetNode("ConnectionString")[0].ToString();
}
///
/// 修改程序版本号
///
///
public void SetVersion(string Version)
{
string strSql = "update Version set VerName='" + Version + "'";
DBHelper.ExecNonQuery(strSql);
}
///
/// 获取程序版本号
///
public string GetVersion()
{
string strSql = "select * from Version";
return DBHelper.ExecuteScalar(strSql).ToString();
}
public List nowListFileDirectory;
public void UpdateListXML(string vs)
{
try
{
string localXmlFile = Application.StartupPath + "\\UpdateList.xml";
if (!File.Exists(localXmlFile)) return;
//读xml版本号
XElement xe = XElement.Load(localXmlFile);
xe.Element("Version").Value = vs.ToString();
nowListFileDirectory = new List();
downNow(Application.StartupPath);
IEnumerable element = from ex in xe.Elements("Files")
select ex;
///删除指定的元素,并保存
if (element.Count() > 0)
{
element.Remove();
}
XElement record = new XElement("Files");
foreach (var item in nowListFileDirectory)
{
if (item.filename.Contains("AutoUpdate")) continue;
XElement file = new XElement(
new XElement("File",
new XAttribute("Name", item.filename),
new XAttribute("MD5Hash", item.MD5Hash == null ? "" : item.MD5Hash)));
record.Add(file);
}
xe.Add(record);
xe.Save(localXmlFile);
}
catch (Exception)
{
return;
}
}
///
/// 递归实现获取ftp目录下所有文件及文件夹以及文件夹内的子文件
///
/// FTP路径
/// 保存的本地路径
/// 用户名
/// 密码
public void downNow(string ftpads)
{
try
{
DirectoryInfo theFolder = new DirectoryInfo(ftpads);
printAllFile(theFolder);
}
catch (Exception ex)
{
MessageBox.Show("获取目录失败+downftp" + ex.ToString());
Environment.Exit(0);
}
}
public void printAllFile(DirectoryInfo di)
{
FileInfo[] fiArray = di.GetFiles();
DirectoryInfo[] diArray = di.GetDirectories();
foreach (FileInfo NextFile in fiArray)
{
var fd = new ftpFileDirectory();
fd.ftpPath = NextFile.DirectoryName + "\\" + NextFile.Name.ToString();
fd.filename = NextFile.Name.ToString();
fd.filelength = NextFile.Length;
fd.MD5Hash = GetMD5HashFromFile(fd.ftpPath);
nowListFileDirectory.Add(fd);
}
foreach (DirectoryInfo inst in diArray)
{
printAllFile(inst);
}
}
///
/// 获取文件的MD5码
///
/// 传入的文件名(含路径及后缀名)
///
public static string GetMD5HashFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, System.IO.FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception)
{
return "";
//throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
}
}
}
///
/// 记录要下载的文件路径及下载到本地的路径
///
public struct ftpFileDirectory
{
///
/// 要下载的文件路径
///
public string ftpPath;
///
/// 下载到本地的路径
///
public string localPath;
///
/// 文件名
///
public string filename;
///
/// 文件大小
///
public long filelength;
///
/// MD5码
///
public string MD5Hash;
}
}