实现方式/思路:FTP文件(应用程序包)下载,解压
帮助类:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace AutoUpdate.Helper
{
public class ProcessHelper
{
private static ProcessHelper instance;
public static ProcessHelper Instance
{
get
{
if (instance == null) instance = new ProcessHelper();
return ProcessHelper.instance;
}
}
/// <summary>
/// 关闭进程
/// </summary>
/// <param name="processName">进程名</param>
public void KillProcessByName(string processName)
{
try
{
Process[] myproc = Process.GetProcesses();
foreach (Process item in myproc)
{
if (item.ProcessName == processName)
{
item.CloseMainWindow();
item.Kill();
}
}
}
catch { return; }
}
/// <summary>
/// 启动进程
/// </summary>
/// <param name="processName">进程名,完全限定名</param>
public void StartProcessByName(string processName)
{
System.Diagnostics.Process.Start(processName);
//Process process = new Process();//声明一个进程类对象
//process.StartInfo.FileName = processName;//Application.StartupPath + "\AutoUpdate.exe";
//process.Start();
}
public void StartProcessByName(string processName,string param)
{
//System.Diagnostics.Process.Start(processName);
Process p = new Process();//声明一个进程类对象
p.StartInfo.FileName = processName;// Application.StartupPath + "\AutoUpdate.exe";
p.StartInfo.UseShellExecute = true;
p.StartInfo.Arguments = param;
p.Start();
}
}
}
using System;
using System.IO;
using System.Diagnostics;
using Microsoft.Win32;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
namespace AutoUpdate.Helper
{
public class SharpZip
{
public SharpZip()
{ }
/// <summary>
/// 压缩
/// </summary>
/// <param name="filename"> 压缩后的文件名(包含物理路径)</param>
/// <param name="directory">待压缩的文件夹(包含物理路径)</param>
public static void PackFiles(string filename, string directory)
{
try
{
FastZip fz = new FastZip();
fz.CreateEmptyDirectories = true;
fz.CreateZip(filename, directory, true, "");
fz = null;
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 解压缩
/// </summary>
/// <param name="file">待解压文件名(包含物理路径)</param>
/// <param name="targetdir"> 解压到哪个目录中(包含物理路径)</param>
public static bool UnpackFiles(string file, string targetdir)
{
try
{
if (!Directory.Exists(targetdir))
{
Directory.CreateDirectory(targetdir);
}
ZipInputStream s = new ZipInputStream(File.OpenRead(file));
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (directoryName != String.Empty)
{
Directory.CreateDirectory(targetdir + directoryName);
}
if (fileName != String.Empty)
{
//FileStream streamWriter = File.Create(targetdir + theEntry.Name);
FileStream streamWriter = File.Create(theEntry.Name);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception)
{
throw;
}
}
}
public class ClassZip
{
#region 私有方法
/// <summary>
/// 递归压缩文件夹方法
/// </summary>
private static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
{
bool res = true;
string[] folders, filenames;
ZipEntry entry = null;
FileStream fs = null;
Crc32 crc = new Crc32();
try
{
entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/"));
s.PutNextEntry(entry);
s.Flush();
filenames = Directory.GetFiles(FolderToZip);
foreach (string file in filenames)
{
fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)));
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
catch
{
res = false;
}
finally
{
if (fs != null)
{
fs.Close();
fs = null;
}
if (entry != null)
{
entry = null;
}
GC.Collect();
GC.Collect(1);
}
folders = Directory.GetDirectories(FolderToZip);
foreach (string folder in folders)
{
if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
{
return false;
}
}
return res;
}
/// <summary>
/// 压缩目录
/// </summary>
/// <param name="FolderToZip">待压缩的文件夹,全路径格式</param>
/// <param name="ZipedFile">压缩后的文件名,全路径格式</param>
private static bool ZipFileDictory(string FolderToZip, string ZipedFile, int level)
{
bool res;
if (!Directory.Exists(FolderToZip))
{
return false;
}
ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));
s.SetLevel(level);
res = ZipFileDictory(FolderToZip, s, "");
s.Finish();
s.Close();
return res;
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="FileToZip">要进行压缩的文件名</param>
/// <param name="ZipedFile">压缩后生成的压缩文件名</param>
private static bool ZipFile(string FileToZip, string ZipedFile, int level)
{
if (!File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");
}
FileStream ZipFile = null;
ZipOutputStream ZipStream = null;
ZipEntry ZipEntry = null;
bool res = true;
try
{
ZipFile = File.OpenRead(FileToZip);
byte[] buffer = new byte[ZipFile.Length];
ZipFile.Read(buffer, 0, buffer.Length);
ZipFile.Close();
ZipFile = File.Create(ZipedFile);
ZipStream = new ZipOutputStream(ZipFile);
ZipEntry = new ZipEntry(Path.GetFileName(FileToZip));
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(level);
ZipStream.Write(buffer, 0, buffer.Length);
}
catch
{
res = false;
}
finally
{
if (ZipEntry != null)
{
ZipEntry = null;
}
if (ZipStream != null)
{
ZipStream.Finish();
ZipStream.Close();
}
if (ZipFile != null)
{
ZipFile.Close();
ZipFile = null;
}
GC.Collect();
GC.Collect(1);
}
return res;
}
#endregion
/// <summary>
/// 压缩
/// </summary>
/// <param name="FileToZip">待压缩的文件目录</param>
/// <param name="ZipedFile">生成的目标文件</param>
/// <param name="level">6</param>
public static bool Zip(String FileToZip, String ZipedFile, int level)
{
if (Directory.Exists(FileToZip))
{
return ZipFileDictory(FileToZip, ZipedFile, level);
}
else if (File.Exists(FileToZip))
{
return ZipFile(FileToZip, ZipedFile, level);
}
else
{
return false;
}
}
/// <summary>
/// 解压
/// </summary>
/// <param name="FileToUpZip">待解压的文件</param>
/// <param name="ZipedFolder">解压目标存放目录</param>
public static void UnZip(string FileToUpZip, string ZipedFolder)
{
if (!File.Exists(FileToUpZip))
{
return;
}
if (!Directory.Exists(ZipedFolder))
{
Directory.CreateDirectory(ZipedFolder);
}
ZipInputStream s = null;
ZipEntry theEntry = null;
string fileName;
FileStream streamWriter = null;
try
{
s = new ZipInputStream(File.OpenRead(FileToUpZip));
while ((theEntry = s.GetNextEntry()) != null)
{
if (theEntry.Name != String.Empty)
{
fileName = Path.Combine(ZipedFolder, theEntry.Name);
if (fileName.EndsWith("/") || fileName.EndsWith("\"))
{
Directory.CreateDirectory(fileName);
continue;
}
streamWriter = File.Create(fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
finally
{
if (streamWriter != null)
{
streamWriter.Close();
streamWriter = null;
}
if (theEntry != null)
{
theEntry = null;
}
if (s != null)
{
s.Close();
s = null;
}
GC.Collect();
GC.Collect(1);
}
}
}
public class ZipHelper
{
#region 私有变量
String the_rar;
RegistryKey the_Reg;
Object the_Obj;
String the_Info;
ProcessStartInfo the_StartInfo;
Process the_Process;
#endregion
/// <summary>
/// 压缩
/// </summary>
/// <param name="zipname">要解压的文件名</param>
/// <param name="zippath">要压缩的文件目录</param>
/// <param name="dirpath">初始目录</param>
public void EnZip(string zipname, string zippath, string dirpath)
{
try
{
the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRAR.exeShellOpenCommand");
the_Obj = the_Reg.GetValue("");
the_rar = the_Obj.ToString();
the_Reg.Close();
the_rar = the_rar.Substring(1, the_rar.Length - 7);
the_Info = " a " + zipname + " " + zippath;
the_StartInfo = new ProcessStartInfo();
the_StartInfo.FileName = the_rar;
the_StartInfo.Arguments = the_Info;
the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
the_StartInfo.WorkingDirectory = dirpath;
the_Process = new Process();
the_Process.StartInfo = the_StartInfo;
the_Process.Start();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 解压缩
/// </summary>
/// <param name="zipname">要解压的文件名</param>
/// <param name="zippath">要解压的文件路径</param>
public void DeZip(string zipname, string zippath)
{
try
{
the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRar.exeShellOpenCommand");
the_Obj = the_Reg.GetValue("");
the_rar = the_Obj.ToString();
the_Reg.Close();
the_rar = the_rar.Substring(1, the_rar.Length - 7);
the_Info = " X " + zipname + " " + zippath;
the_StartInfo = new ProcessStartInfo();
the_StartInfo.FileName = the_rar;
the_StartInfo.Arguments = the_Info;
the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
the_Process = new Process();
the_Process.StartInfo = the_StartInfo;
the_Process.Start();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Net;
using System.Text;
using System.Windows.Forms;
namespace AutoUpdate.Helper
{
public class UpdateHelper
{
private static UpdateHelper instance;
public static UpdateHelper Instance
{
get
{
if (instance == null) instance = new UpdateHelper();
return UpdateHelper.instance;
}
}
//基本设置
private string FTPFilePath = @"ftp://" + ConfigurationManager.AppSettings["FTPFilePath"]; //目标路径
private string FtpServerPort = ConfigurationManager.AppSettings["FtpServerPort"]; //ftp IP地址
private string FtpServerIP = ConfigurationManager.AppSettings["FtpServerIP"]; //ftp IP地址
private string FtpServerUserName = ConfigurationManager.AppSettings["FtpServerUserName"]; //ftp用户名
private string FtpServerPassword = ConfigurationManager.AppSettings["FtpServerPassword"]; //ftp密码
//获取ftp上面的文件和文件夹
public string[] GetFileList(string dir)
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
FtpWebRequest request;
try
{
request = (FtpWebRequest)FtpWebRequest.Create(new Uri(FTPFilePath));
request.UseBinary = true;
request.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);//设置用户名和密码
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.UseBinary = true;
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("
");
Console.WriteLine(line);
line = reader.ReadLine();
}
// to remove the trailing '
'
result.Remove(result.ToString().LastIndexOf('
'), 1);
reader.Close();
response.Close();
return result.ToString().Split('
');
}
catch (Exception ex)
{
Console.WriteLine("获取ftp上面的文件和文件夹:" + ex.Message);
downloadFiles = null;
return downloadFiles;
}
}
/// <summary>
/// 获取文件大小
/// </summary>
/// <param name="file">ip服务器下的相对路径</param>
/// <returns>文件大小</returns>
public int GetFileSize(string file)
{
StringBuilder result = new StringBuilder();
FtpWebRequest request;
try
{
request = (FtpWebRequest)FtpWebRequest.Create(new Uri(FTPFilePath + file));
request.UseBinary = true;
request.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);//设置用户名和密码
request.Method = WebRequestMethods.Ftp.GetFileSize;
return (int)request.GetResponse().ContentLength;
}
catch (Exception ex)
{
Console.WriteLine("获取文件大小出错:" + ex.Message);
return -1;
}
}
/// <summary>
/// 文件上传
/// </summary>
/// <param name="filePath">原路径(绝对路径)包括文件名</param>
/// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param>
public void FileUpLoad(string filePath, string objPath = "")
{
try
{
string url = FTPFilePath;
if (objPath != "") url += objPath + "/";
try
{
FtpWebRequest reqFTP = null;
//待上传的文件 (全路径)
try
{
FileInfo fileInfo = new FileInfo(filePath);
using (FileStream fs = fileInfo.OpenRead())
{
long length = fs.Length;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + fileInfo.Name));
//设置连接到FTP的帐号密码
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
//设置请求完成后是否保持连接
reqFTP.KeepAlive = false;
//指定执行命令
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
//指定数据传输类型
reqFTP.UseBinary = true;
using (Stream stream = reqFTP.GetRequestStream())
{
//设置缓冲大小
int BufferLength = 5120;
byte[] b = new byte[BufferLength];
int i;
while ((i = fs.Read(b, 0, BufferLength)) > 0)
{
stream.Write(b, 0, i);
}
Console.WriteLine("上传文件成功");
}
}
}
catch (Exception ex)
{
Console.WriteLine("上传文件失败错误为" + ex.Message);
}
finally
{
}
}
catch (Exception ex)
{
Console.WriteLine("上传文件失败错误为" + ex.Message);
}
finally
{
}
}
catch (Exception ex)
{
Console.WriteLine("上传文件失败错误为" + ex.Message);
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">服务器下的相对路径 包括文件名</param>
public void DeleteFileName(string fileName)
{
try
{
FileInfo fileInf = new FileInfo(FtpServerIP + "" + fileName);
string uri = FTPFilePath + fileName;
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
// 指定数据传输类型
reqFTP.UseBinary = true;
// ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
// 默认为true,连接不会被关闭
// 在一个命令之后被执行
reqFTP.KeepAlive = false;
// 指定执行什么命令
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
response.Close();
}
catch (Exception ex)
{
Console.WriteLine("删除文件出错:" + ex.Message);
}
}
/// <summary>
/// 新建目录 上一级必须先存在
/// </summary>
/// <param name="dirName">服务器下的相对路径</param>
public void MakeDir(string dirName)
{
try
{
string uri = FTPFilePath + dirName;
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
// 指定数据传输类型
reqFTP.UseBinary = true;
// ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
response.Close();
}
catch (Exception ex)
{
Console.WriteLine("创建目录出错:" + ex.Message);
}
}
/// <summary>
/// 删除目录 上一级必须先存在
/// </summary>
/// <param name="dirName">服务器下的相对路径</param>
public void DelDir(string dirName)
{
try
{
string uri = FTPFilePath + dirName;
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
// ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
response.Close();
}
catch (Exception ex)
{
Console.WriteLine("删除目录出错:" + ex.Message);
}
}
/// <summary>
/// 从ftp服务器上获得文件夹列表
/// </summary>
/// <param name="RequedstPath">服务器下的相对路径</param>
/// <returns></returns>
public List<string> GetDirctory(string RequedstPath)
{
List<string> strs = new List<string>();
try
{
string uri = FTPFilePath + RequedstPath; //目标路径 path为服务器地址
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
// ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名
string line = reader.ReadLine();
while (line != null)
{
if (line.Contains("<DIR>"))
{
string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim();
strs.Add(msg);
}
line = reader.ReadLine();
}
reader.Close();
response.Close();
return strs;
}
catch (Exception ex)
{
Console.WriteLine("获取目录出错:" + ex.Message);
}
return strs;
}
/// <summary>
/// 从ftp服务器上获得文件列表
/// </summary>
/// <param name="RequedstPath">服务器下的相对路径</param>
/// <returns></returns>
public List<string> GetFile(string RequedstPath)
{
List<string> strs = new List<string>();
try
{
string uri = FTPFilePath + RequedstPath; //目标路径 path为服务器地址
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
// ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名
string line = reader.ReadLine();
while (line != null)
{
if (!line.Contains("<DIR>"))
{
string msg = line.Substring(39).Trim();
strs.Add(msg);
}
line = reader.ReadLine();
}
reader.Close();
response.Close();
return strs;
}
catch (Exception ex)
{
Console.WriteLine("获取文件出错:" + ex.Message);
}
return strs;
}
/// <summary>
/// 从ftp服务器上下载文件的功能
/// </summary>
/// <param name="fileName">文件名称</param>
public void Download(string fileName)
{
FtpWebRequest reqFTP;
try
{
string filePath = Application.StartupPath;
FileStream outputStream = new FileStream(filePath + "\" + fileName, FileMode.Create);
string str = FTPFilePath + ":" + FtpServerPort + "/" + fileName;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(str));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)reqFTP.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();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 解压文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="initPath">路径(不含文件名)</param>
public void DownloadDir(string fileName,string initPath)
{
FtpWebRequest reqFTP;
try
{
string filePath = initPath;// Application.StartupPath;
FileStream outputStream = new FileStream(filePath + "\" + fileName, FileMode.Create);
string str = FTPFilePath + ":" + FtpServerPort + "/" + fileName;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(str));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)reqFTP.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();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 从ftp服务器上下载文件的功能
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="targetPath">存放目标位置+文件名称</param>
public void Download(string fileName, string targetPath)
{
FtpWebRequest reqFTP;
try
{
string filePath = Application.StartupPath;
//FileStream outputStream = new FileStream(filePath + "\" + fileName, FileMode.Create);
FileStream outputStream = new FileStream(targetPath, FileMode.Create);
string str = FTPFilePath + ":" + FtpServerPort + "/" + fileName;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(str));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)reqFTP.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();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 用FTP方式上传文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="uploadUrl"></param>
/// <param name="msg"></param>
public void Upload(string fileName, string uploadUrl)
{
Stream requestStream = null;
FileStream fileStream = null;
FtpWebResponse response = null; try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uploadUrl);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
request.Proxy = null;
requestStream = request.GetRequestStream();
fileStream = File.Open(fileName, FileMode.Open);
byte[] buffer = new byte[1024];
int bytesRead;
while (true)
{
bytesRead = fileStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
requestStream.Write(buffer, 0, bytesRead);
}
requestStream.Close();
response = (FtpWebResponse)request.GetResponse();
}
catch (UriFormatException ex)
{
}
catch (IOException ex)
{
}
catch (WebException ex)
{
}
finally
{
if (response != null) response.Close();
if (fileStream != null) fileStream.Close();
if (requestStream != null) requestStream.Close();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AutoUpdate.Helper
{
public class VarHelper
{
private static VarHelper instance;
public static VarHelper Instance
{
get
{
if (instance == null) instance = new VarHelper();
return VarHelper.instance;
}
}
//初始路径 + 自动更新程序名称 + 主程序名称
//string param = fullPath + ","
// + "AutoUpdate\AutoUpdate.exe," //自动更新程序
// + "Debug\AutoUpdateApp.exe,"//主程序
// + "Debug";//下载包
/// <summary>
/// 需要更新的文件夹 初始路径
/// </summary>
public string InitPath = "";
/// <summary>
/// 自动更新程序名称
/// </summary>
public string AutoUpdateExe = "";
/// <summary>
/// 主程序名称
/// </summary>
public string MainExe = "";
/// <summary>
/// 下载包
/// </summary>
public string DownDir = "";
}
}
自动更新程序:

using AutoUpdate.Helper;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using ZB.QueueSys.Common;
namespace AutoUpdate
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
UpdateApp();
}
private void UpdateApp()
{
this.probarWatting.Style = ProgressBarStyle.Marquee;
this.probarWatting.Show();
try
{
#region 注释代码
//NewMethod();
// DirectoryInfo di = new DirectoryInfo(string.Format(@"{0}....", Application.StartupPath));
// string fullPath = di.FullName;
// string param = fullPath + ","
//+ "AutoUpdate\AutoUpdate.exe," //自动更新程序
//+ "Debug\AutoUpdateApp.exe,"//主程序
//+ "Debug";//下载包
// VarHelper.Instance.InitPath = param[0];
// VarHelper.Instance.AutoUpdateExe = param[1];
// VarHelper.Instance.MainExe = param[2];
// VarHelper.Instance.DownDir = param[3];
#endregion
string fileZip = VarHelper.Instance.InitPath + VarHelper.Instance.DownDir;//+ "\QueueSys.zip";
string target = VarHelper.Instance.InitPath + "\" + VarHelper.Instance.DownDir;
UpdateHelper.Instance.DownloadDir(VarHelper.Instance.DownDir + ".zip", VarHelper.Instance.InitPath);//需要下载的压缩文件名称
//从那解压到哪
SharpZip.UnpackFiles(fileZip + ".zip", target);//MessageBox.Show("解压target==" + target); //ClassZip.UnZip(fileZip + ".zip", target);
DialogResult result = MessageBox.Show("更新已完成,是否启动预约程序?", "提示",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (result.Equals(DialogResult.OK))
{
File.Delete(fileZip + ".zip");//MessageBox.Show("开始删除临时压缩文件" + fileZip + ".zip");
string mainExe = VarHelper.Instance.InitPath + VarHelper.Instance.MainExe;//"\QueueSys";
ProcessHelper.Instance.StartProcessByName(mainExe); //MessageBox.Show("启动==" + mainExe);
ProcessHelper.Instance.KillProcessByName("AutoUpdate");
//System.GC.Collect();//垃圾回收
}
}
catch (Exception ex)
{
//MessageBox.Show("删除压缩文件==" + ex.Message + ex.StackTrace);
MessageBox.Show("更新失败,请联系管理员");
LogHelper.Instance.SaveText("" + ex.Message + ex.StackTrace);
return;
}
}
private void NewMethod()
{
// 第一步下载需要更新的配置文件
string filepath = "UpdateList.xml";
UpdateHelper.Instance.Download(filepath);
// 第二步 提供并解析配置文件(获取需要更新的文件名称、文件更新后的路径)
string path = Application.StartupPath + "\UpdateList.xml";
List<UpdateList> list = AutoUpdate.Helper.XmlHelper.Instance.GetUpdateList(path, "Root");
//第三步 循环下载文件到指定路径
foreach (UpdateList item in list)
{
if (string.IsNullOrEmpty(item.PATH)) UpdateHelper.Instance.Download(item.NAME);//下载至根目录
else //下载至指定目录
{
string targetPath = Application.StartupPath + "\" + item.PATH + "\" + item.NAME;
UpdateHelper.Instance.Download(item.NAME, targetPath);
}
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("程序正在更新,退出将导致异常", "是否确认退出",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (result.Equals(DialogResult.OK))
{
Application.Exit();
}
}
private void buttonTest_Click(object sender, EventArgs e)
{
UpdateApp();
}
}
}
主程序:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AutoUpdateApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
DirectoryInfo info = new DirectoryInfo(Application.StartupPath);
string path = info.Parent.Parent.FullName;
DirectoryInfo di = new DirectoryInfo(string.Format(@"{0}....", Application.StartupPath));
string fullPath = di.FullName;
//初始路径 + 自动更新程序名称 + 主程序名称
string param = fullPath + ","
+ "AutoUpdate\AutoUpdate.exe," //自动更新程序
+ "Debug\AutoUpdateApp.exe,"//主程序
+ "Debug";//下载包
//AutoUpdate
Process p = new Process();//声明一个进程类对象
p.StartInfo.FileName = fullPath + "AutoUpdate\AutoUpdate.exe";
p.StartInfo.UseShellExecute = true;
p.StartInfo.Arguments = param;//第一个参数为需要下载的压缩文件,第二个为需要启动的程序
p.Start();
//关闭当期
//Process[] p_arry = Process.GetProcesses();//得到系统所有进程
//for (int i = 0; i < p_arry.Length; i++)//遍历每个进程
//{
// if (p_arry[i].ProcessName == "AutoUpdateApp")//发现有名为QQ的进程
// {
// p_arry[i].Kill();//就结束它。
// return;
// }
//}
KillProcessByName("AutoUpdateApp");
System.GC.Collect();//垃圾回收
}
/// <summary>
/// 关闭进程
/// </summary>
/// <param name="processName">进程名</param>
public void KillProcessByName(string processName)
{
try
{
Process[] myproc = Process.GetProcesses();
foreach (Process item in myproc)
{
if (item.ProcessName == processName)
{
item.CloseMainWindow();
item.Kill();
}
}
}
catch { return; }
}
}
}