奉上CODE:
1.Access操作類:
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
namespace LogHelper.BLL
{
/// <summary>
/// 更新錯誤日志處理類
/// </summary>
public class Log
{
PRivate string _connStr;
public Log(string connStr)
{
_connStr = connStr;
}
/// <summary>
/// 添加一條日志
/// </summary>
/// <param name="title"></param>
/// <param name="content"></param>
/// <returns></returns>
public bool Add(LogHelper.Model.Log modLog)
{
bool b = false;
if (!string.IsNullOrEmpty(_connStr))
{
OleDbConnection objConnection = new OleDbConnection(_connStr);
try
{
objConnection.Open();
string insertSql = "insert into LogInfo(Title,Content,CreateDate) values('" + modLog.Title + "','" + modLog.Content + "','" + modLog.CreateDate + "')";
OleDbCommand cmd = new OleDbCommand(insertSql,objConnection);
cmd.ExecuteNonQuery();
b= true;
}
catch (Exception ex)
{ }
finally
{
objConnection.Close();
}
}
return b;
}
}
}
namespace LogHelper.Model
{
/// <summary>
/// UpdateErrorLog模型
/// </summary>
public class Log
{
string _title;
public string Title
{
get { return _title; }
set { _title = value; }
}
string _content;
public string Content
{
get { return _content; }
set { _content = value; }
}
string _createDate;
public string CreateDate
{
get { return _createDate; }
set { _createDate = value; }
}
}
}
2.XML當前版本配置操作類:
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace EyesBaby
{
/// <summary>
/// 當前版本配置操作類
/// </summary>
public class CurrentVesionHelper
{
private const string _configName = "CurrentInfo.config";
private const string _currentVesionKeyName = "currentVesion";
private const string _updateDateKeyName = "updateDate";
private const string _programNameKeyName = "programName";
private const string _installDirKeyName = "installDir";
XMLHandle XML = null;
private string _currentVesion;
private string _updateDate;
private string _installDir;
private string _programName;
/// <summary>
/// 安裝目錄
/// </summary>
public string InstallDir
{
get { return _installDir; }
set { _installDir = value; }
}
/// <summary>
/// 應用程序名稱
/// </summary>
public string ProgramName
{
get { return _programName; }
set { _programName = value; }
}
/// <summary>
/// 當前版本
/// </summary>
public string CurrentVesion
{
get { return _currentVesion; }
set { _currentVesion = value; }
}
/// <summary>
/// 更新日期
/// </summary>
public string UpdateDate
{
get { return _updateDate; }
set { _updateDate = value; }
}
public CurrentVesionHelper()
{
if (!string.IsNullOrEmpty(_configName))
{
string filepath = application.StartupPath +"\\"+ _configName;
xml = new XMLHandle();
XML.Load(filepath);
_currentVesion = XML.GetValueByID(_currentVesionKeyName);
_updateDate = XML.GetValueByID(_updateDateKeyName);
_installDir = XML.GetValueByID(_installDirKeyName);
_programName = XML.GetValueByID(_programNameKeyName);
}
}
/// <summary>
/// 更新保存
/// </summary>
public void UpdateVesion()
{
XML.SetValueByID(_currentVesionKeyName, _currentVesion);
XML.SetValueByID(_updateDateKeyName, _updateDate);
XML.SetValueByID(_installDirKeyName, _installDir);
XML.SetValueByID(_programNameKeyName, _programName);
}
}
}
3.HttpWebRequest下載文件
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace EyesBaby
{
/// <summary>
/// 文件下載類
/// </summary>
public class DownloadClass
{
public string StrUrl;//文件下載網址
public string StrFileName;//下載文件保存地址
public string strError;//返回結果
public long lStartPos = 0; //返回上次下載字節
public long lCurrentPos = 0;//返回當前下載字節
public long lDownloadFile;//返回當前下載文件長度
public void DownloadFile()
{
System.IO.FileStream fs;
if (System.IO.File.Exists(StrFileName))
{
fs = System.IO.File.OpenWrite(StrFileName);
lStartPos = fs.Length;
fs.Seek(lStartPos, System.IO.SeekOrigin.Current);
//移動文件流中的當前指針
}
else
{
fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
lStartPos = 0;
}
//打開網絡連接
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
long length = request.GetResponse().ContentLength;
lDownloadFile = length;
if (lStartPos > 0)
request.AddRange((int)lStartPos); //設置Range值
//向服務器請求,獲得服務器回應數據流
System.IO.Stream ns = request.GetResponse().GetResponseStream();
byte[] nbytes = new byte[512];
int nReadSize = 0;
nReadSize = ns.Read(nbytes, 0, 512);
while (nReadSize > 0)
{
fs.Write(nbytes, 0, nReadSize);
nReadSize = ns.Read(nbytes, 0, 512);
lCurrentPos = fs.Length;
}
fs.Close();
ns.Close();
strError = "下載完成";
}
catch (Exception ex)
{
fs.Close();
strError = "下載過程中出現錯誤:" + ex.ToString();
}
}
}
}
4.GZipStream解壓縮文件包
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.IO.Compression;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;
namespace EyesBaby
{
public class clsZip
{
public void CompressFile(string sourceFile, string destinationFile)
{
// make sure the source file is there
if (File.Exists(sourceFile) == false)
throw new FileNotFoundException();
// Create the streams and byte arrays needed
byte[] buffer = null;
FileStream sourceStream = null;
FileStream destinationStream = null;
GZipStream compressedStream = null;
try
{
// Read the bytes from the source file into a byte array
sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);
// Read the source stream values into the buffer
buffer = new byte[sourceStream.Length];
int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);
if (checkCounter != buffer.Length)
{
throw new ApplicationException();
}
// Open the FileStream to write to
destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write);
// Create a compression stream pointing to the destiantion stream
compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true);
// Now write the compressed data to the destination file
compressedStream.Write(buffer, 0, buffer.Length);
}
catch (ApplicationException ex)
{
MessageBox.Show(ex.Message, "壓縮文件時發生錯誤:", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
// Make sure we allways close all streams
if (sourceStream != null)
sourceStream.Close();
if (compressedStream != null)
compressedStream.Close();
if (destinationStream != null)
destinationStream.Close();
}
}
public void DecompressFile(string sourceFile, string destinationFile)
{
// make sure the source file is there
if (File.Exists(sourceFile) == false)
throw new FileNotFoundException();
// Create the streams and byte arrays needed
FileStream sourceStream = null;
FileStream destinationStream = null;
GZipStream decompressedStream = null;
byte[] quartetBuffer = null;
try
{
// Read in the compressed source stream
sourceStream = new FileStream(sourceFile, FileMode.Open);
// Create a compression stream pointing to the destiantion stream
decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
// Read the footer to determine the length of the destiantion file
quartetBuffer = new byte[4];
int position = (int)sourceStream.Length - 4;
sourceStream.Position = position;
sourceStream.Read(quartetBuffer, 0, 4);
sourceStream.Position = 0;
int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
byte[] buffer = new byte[checkLength + 100];
int offset = 0;
int total = 0;
// Read the compressed data into the buffer
while (true)
{
int bytesRead = decompressedStream.Read(buffer, offset, 100);
if (bytesRead == 0)
break;
offset += bytesRead;
total += bytesRead;
}
// Now write everything to the destination file
destinationStream = new FileStream(destinationFile, FileMode.Create);
destinationStream.Write(buffer, 0, total);
// and flush everyhting to clean out the buffer
destinationStream.Flush();
}
catch (ApplicationException ex)
{
MessageBox.Show(ex.Message, "解壓文件時發生錯誤:", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
// Make sure we allways close all streams
if (sourceStream != null)
sourceStream.Close();
if (decompressedStream != null)
decompressedStream.Close();
if (destinationStream != null)
destinationStream.Close();
}
}
/// <summary>
/// 功能:解壓zip格式的文件。
/// </summary>
/// <param name="zipFilePath">壓縮文件路徑</param>
/// <param name="unZipDir">解壓文件存放路徑,為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾</param>
/// <param name="err">出錯信息</param>
/// <returns>解壓是否成功</returns>
public bool UnZipFile(string zipFilePath, string unZipDir, out string err)
{
err = "";
if (zipFilePath == string.Empty)
{
err = "壓縮文件不能為空!";
return false;
}
if (!File.Exists(zipFilePath))
{
err = "壓縮文件不存在!";
return false;
}
//解壓文件夾為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾
if (unZipDir == string.Empty)
unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
if (!unZipDir.EndsWith("\\"))
unZipDir += "\\";
if (!Directory.Exists(unZipDir))
Directory.CreateDirectory(unZipDir);
try
{
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (directoryName.Length > 0)
{
Directory.CreateDirectory(unZipDir + directoryName);
}
if (!directoryName.EndsWith("\\"))
directoryName += "\\";
if (fileName != String.Empty)
{
using (FileStream streamWriter = File.Create(unZipDir + 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;
}
}
}
}
}//while
}
}
catch (Exception ex)
{
err = ex.Message;
return false;
}
return true;
}//
}
}
5.System.Diagnostics.Process操作進程
// 關閉程序
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(programName);
foreach (System.Diagnostics.Process p in ps)
{
p.Kill();
}
// 重啟程序
System.Diagnostics.Process.Start(startpath);
6.System.IO文件夾/文件復制
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace EyesBaby
{
public class CopyFolder
{
private static int total = 0;
private int FileNumber = 0; //文件夾文件總數
/// <summary>
/// 復制文件夾
/// </summary>
/// <param name="sourceDirName">源文件夾</param>
/// <param name="destDirName">目標文件夾</param>
//復制文件夾
public void CopyDirectory(string sourceDirName, string destDirName)
{
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
File.SetAttributes(destDirName, File.GetAttributes(sourceDirName));
//File.SetAttributes(destDirName,FileAttributes.Normal);
}
if (destDirName[destDirName.Length - 1] != Path.DirectorySeparatorChar)
destDirName = destDirName + Path.DirectorySeparatorChar;
string[] files = Directory.GetFiles(sourceDirName);
foreach (string file in files)
{
File.Copy(file, destDirName + Path.GetFileName(file), true);
File.SetAttributes(destDirName + Path.GetFileName(file), FileAttributes.Normal);
total++;
}
string[] dirs = Directory.GetDirectorIEs(sourceDirName);
foreach (string dir in dirs)
{
CopyDirectory(dir, destDirName + Path.GetFileName(dir));
}
}
public static int GetFilesCount(System.IO.DirectoryInfo dirInfo)
{
int totalFile = 0;
totalFile += dirInfo.GetFiles().Length;
foreach (System.IO.DirectoryInfo subdir in dirInfo.GetDirectorIEs())
{
totalFile += GetFilesCount(subdir);
}
return totalFile;
}
}
}
7.ProgressBar和BackgroundWorker顯示整個更新版本進度
代碼
// 啟動執行
bkgWorker.RunWorkerAsync();
/// <summary>
/// 設置加載時間值
/// </summary>
/// <param name="text"></param>
/// <param name="value"></param>
private void SetValue(string text, int value)
{
// 更新進度
for (int i = 1; i <= value; i++)
{
bkgWorker.ReportProgress(1, text);
System.Threading.Thread.Sleep(10);
}
}
/// <summary>
/// 執行工作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// 調用更新
CallUpdate();
}
/// <summary>
/// 操作進程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblMsg.Text = e.UserState.ToString();
prgUpdate.Value += e.ProgressPercentage;
}
/// <summary>
/// 調用更新
/// </summary>
private void CallUpdate()
{
LogHelper.Model.Log modLog = new LogHelper.Model.Log();
// 判斷是否有新版本
AutoUpdate autoUpdate = new AutoUpdate();
CurrentVesionHelper currentVesion = new CurrentVesionHelper();
string updatexmlpath = System.Configuration.ConfigurationSettings.APPSettings["updateXMLPath"];
UpdateXmlHelper updateXml = new UpdateXmlHelper(updateXMLpath);
string oldVesion = currentVesion.CurrentVesion;
string newVesion = updateXML.Vesion;
string newDownURL = updateXML.DownURL;
bool b = autoUpdate.IsNewVesion(newVesion, oldVesion);
if (b)
{
string filename = newDownURL.Substring(newDownURL.LastIndexOf('/') + 1);
string savePath = Application.StartupPath + "/update/" + filename;
SetValue("正在下載新版本……", 10);
if (autoUpdate.DownNewEdition(newDownURL, savePath))
{
string installDir = currentVesion.InstallDir = Application.StartupPath;
string programName = currentVesion.ProgramName;
string error = string.Empty;
string zipfilepath = savePath;
string unzipdir = Application.StartupPath + "\\update\\" + DateTime.Now.ToString("yyyy-MM-dd") + "\\";
SetValue("正在解壓文件包……", 20);
// 解壓文件包
clsZip zip = new clsZip();
zip.UnZipFile(zipfilepath, unzipdir, out error);
SetValue("正在關閉程序……", 10);
// 關閉程序
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(programName);
foreach (System.Diagnostics.Process p in ps)
{
p.Kill();
}
SetValue("正在覆蓋原安裝程序……", 20);
#region 覆蓋原安裝程序
// 休息1秒
System.Threading.Thread.Sleep(1000);
string installPath = installDir + "\\" + programName;
//if (System.IO.Directory.Exists(installPath))
//{
// // 先刪除原安裝路徑
// System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(installPath);
// dir.Delete(true);
// //System.IO.Directory.Delete(installPath, true);
//}
//// 休息3秒
//System.Threading.Thread.Sleep(5000);
// 再將新版本復制到原安裝目錄
CopyFolder copy = new CopyFolder();
copy.CopyDirectory(unzipdir, installDir);
//System.IO.Directory.Move(unzipdir, installDir);
#endregion
string exepath = "EyesBaby.exe";
// 休息3秒
System.Threading.Thread.Sleep(3000);
string startpath = installPath + "\\" + exepath;
SetValue("記錄新版本……", 20);
// 記錄新版本到CurrentInfo.config
currentVesion.CurrentVesion = newVesion;
currentVesion.UpdateDate = DateTime.Now.ToShortDateString();
currentVesion.UpdateVesion();
modLog.Content = "更新成功--新版本號:" + newVesion;
//MessageBox.Show("更新成功!");
SetValue("重啟程序……", 20);
// 重啟程序
System.Diagnostics.Process.Start(startpath);
}
else
{
modLog.Content = "下載最新版本失敗";
MessageBox.Show("下載最新版本失敗!");
}
}
else
modLog.Content = "沒有發現新版本";
modLog.Title = "調用更新服務";
modLog.CreateDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
bllLog.Add(modLog);
}
部分代碼也是從網上東拼西湊找出來的,現已丟失源文路徑。深感抱歉!
我的第一款實用工具-眼保程序(EyesBaby)
EyesBaby1.0使用幫助文檔
EyesBaby功能實現之窗口拖拽與縮放功能
EyesBaby功能實現之圖片控件上添加字符
EyesBaby功能實現之Windows前景色調節器