using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Windows.Forms; using System.Security.Cryptography; using System.Collections; using System.Xml.Linq; using System.Reflection; namespace AIMSAutoUpdate { /// /// ftp下载类 /// public class FTPTransmission { /// /// 记录所有要下载的文件路径及下载到本地的路径 /// public static List ListFileDirectory = new List(); /// /// 记录当前文件路径及下载到本地的路径 /// public static List nowListFileDirectory = new List(); /// /// 记录要下载的文件路径及下载到本地的路径 /// public struct ftpFileDirectory { /// /// 要下载的文件路径 /// public string ftpPath; /// /// 下载到本地的路径 /// public string localPath; /// /// 文件名 /// public string filename; /// /// 文件大小 /// public long filelength; /// /// MD5码 /// public string MD5Hash; } /// /// 设置ftp服务器的命令,并获取文件和文件夹,以及文件夹内的子文件 /// /// FTP地址路径 /// 要发送到FTP服务器的命令 /// 用户名 /// 密码 /// public static string[] ftp(string ftpads, string type, string username, string password, string encoding) { WebResponse webresp = null; StreamReader ftpFileListReader = null; FtpWebRequest ftpRequest = null; try { ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpads)); ftpRequest.Method = type; ftpRequest.UsePassive = false;//只需要添加这一句话 ftpRequest.Credentials = new NetworkCredential(username, password); webresp = ftpRequest.GetResponse(); if (encoding == "Default") { ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default); } else { ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.UTF8); } StringBuilder str = new StringBuilder(); string line = ftpFileListReader.ReadLine(); while (line != null) { str.Append(line); str.Append("\n"); line = ftpFileListReader.ReadLine(); } string[] fen = str.ToString().Split('\n'); return fen; } catch (Exception ) { MessageBox.Show("更新失败! 请检查网络或者FTP用户名与口令!"); Environment.Exit(0); return null; } } /// /// 递归实现获取ftp目录下所有文件及文件夹以及文件夹内的子文件 /// /// FTP路径 /// 保存的本地路径 /// 用户名 /// 密码 public static void downftp(string ftpads, string downloadDir, string username, string password, Hashtable htUpdateFile, string encoding) { try { downloadDir = downloadDir.Replace("\\\\", "\\"); string ftpdir = ftpads; string[] fullname = ftp(ftpads, WebRequestMethods.Ftp.ListDirectoryDetails, username, password, encoding); if (fullname == null) return; string[] onlyname = ftp(ftpads, WebRequestMethods.Ftp.ListDirectory, username, password, encoding); if (onlyname == null) return; if (!Directory.Exists(downloadDir)) { Directory.CreateDirectory(downloadDir); } foreach (string names in fullname) { //判断是否具有文件夹标识 if (names.Contains("")) { string olname = names.Split(new string[] { "" }, StringSplitOptions.None)[1].Trim(); downftp(ftpads + "/" + olname, downloadDir + "\\" + olname, username, password, htUpdateFile, encoding); } else { foreach (string onlynames in onlyname) { if (string.IsNullOrEmpty(onlynames.Trim()) || string.IsNullOrEmpty(names.Trim())) break; if (names.Contains(" " + onlynames)) { //download(downloadDir + "\\" + onlynames, ftpads + "/" + onlynames, username, password); var fd = new ftpFileDirectory(); fd.ftpPath = ftpads + "/" + onlynames.ToString(); fd.localPath = downloadDir + "\\" + onlynames.ToString(); fd.localPath = fd.localPath.Replace("\\\\", "\\"); fd.filename = onlynames.ToString(); fd.filelength = GetFileSize(fd.ftpPath, username, password); for (int i = 0; i < htUpdateFile.Count; i++) { string[] fileArray = (string[])htUpdateFile[i]; if (fd.filename == fileArray[0]) { fd.MD5Hash = fileArray[1]; break; } } ListFileDirectory.Add(fd); break; } } } } } catch (Exception ex) { MessageBox.Show("获取目录失败+downftp" + ex.ToString()); Environment.Exit(0); } } /// /// 递归实现获取ftp目录下所有文件及文件夹以及文件夹内的子文件 /// /// FTP路径 /// 保存的本地路径 /// 用户名 /// 密码 public static void downNow(string ftpads) { try { DirectoryInfo theFolder = new DirectoryInfo(ftpads); printAllFile(theFolder); } catch (Exception ex) { MessageBox.Show("获取目录失败+downftp" + ex.ToString()); Environment.Exit(0); } } public static void printAllFile(DirectoryInfo di) { FileInfo[] fiArray = di.GetFiles(); DirectoryInfo[] diArray = di.GetDirectories(); foreach (FileInfo NextFile in fiArray) { if (NextFile.Name.Contains("AIMSAutoUpdate") || NextFile.Name.Contains("AIMS")) continue; 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); } } /// /// 单个文件下载 /// /// 保存文件的本地路径 /// 下载文件的FTP路径 /// 用户名 /// 密码 public static void download(string adss, string ftpadss, string username, string password) { //FileMode常数确定如何打开或创建文件,指定操作系统应创建新文件。 //FileMode.Create如果文件已存在,它将被改写 FileStream outputStream = new FileStream(adss, FileMode.Create); FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpadss)); downRequest.Credentials = new NetworkCredential(username, password); downRequest.UsePassive = false;//只需要添加这一句话 //设置要发送到 FTP 服务器的命令 downRequest.Method = WebRequestMethods.Ftp.DownloadFile; FtpWebResponse response = (FtpWebResponse)downRequest.GetResponse(); Stream ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); } /// /// 获得文件大小 /// /// /// public static long GetFileSize(string ftpadss, string username, string password) { long fileSize = 0; try { FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpadss)); downRequest.Credentials = new NetworkCredential(username, password); downRequest.Method = WebRequestMethods.Ftp.GetFileSize; downRequest.UsePassive = false;//只需要添加这一句话 FtpWebResponse response = (FtpWebResponse)downRequest.GetResponse(); fileSize = response.ContentLength; response.Close(); } catch (Exception e) { MessageBox.Show(e.Message); } return fileSize; } /// /// FTP获取文件的MD5码 /// /// 传入的文件名(含路径及后缀名) /// public static string FTPGetMD5HashFromFile(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); } } /// /// 获取文件的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 static void UpdateListXML() { try { string localXmlFile = AppDomain.CurrentDomain.BaseDirectory + "\\UpdateList.xml"; if (!File.Exists(localXmlFile)) return; XElement xe = XElement.Load(localXmlFile); //获取本地EXE版本号 Assembly currentAssembly = Assembly.LoadFile(Application.ExecutablePath.Trim()); AssemblyName CurrentAssemblyName = currentAssembly.GetName(); string Version = CurrentAssemblyName.Version.ToString(); Version vs = new Version(Version); Version newvs = new Version(xe.Element("Version").Value); if (vs.CompareTo(newvs) > 0) { xe.Element("Version").Value = Version; FTPTransmission.downNow(AppDomain.CurrentDomain.BaseDirectory); 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 FTPTransmission.nowListFileDirectory) { if (item.filename.Contains("AIMSAutoUpdate")) continue; FTPTransmission.ftpFileDirectory f = item; XElement file = new XElement( new XElement("File", //new XAttribute("Ver", Version), new XAttribute("Name", item.filename), new XAttribute("MD5Hash", item.MD5Hash))); record.Add(file); } xe.Add(record); xe.Save(localXmlFile); } } catch (Exception) { return; } } public static Encoding GetEncoding(string filePath) { if (filePath == null) { throw new ArgumentNullException("filePath"); } Encoding encoding1 = Encoding.Default; if (File.Exists(filePath)) { try { using (FileStream stream1 = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { if (stream1.Length > 0) { using (StreamReader reader1 = new StreamReader(stream1, true)) { char[] chArray1 = new char[1]; reader1.Read(chArray1, 0, 1); encoding1 = reader1.CurrentEncoding; reader1.BaseStream.Position = 0; if (encoding1 == Encoding.UTF8) { byte[] buffer1 = encoding1.GetPreamble(); if (stream1.Length >= buffer1.Length) { byte[] buffer2 = new byte[buffer1.Length]; stream1.Read(buffer2, 0, buffer2.Length); for (int num1 = 0; num1 < buffer2.Length; num1++) { if (buffer2[num1] != buffer1[num1]) { encoding1 = Encoding.Default; break; } } } else { encoding1 = Encoding.Default; } } } } } } catch (Exception) { throw; } if (encoding1 == null) { encoding1 = Encoding.UTF8; } } return encoding1; } } }