using System;
using System.Data;
using System.Drawing;
using System.Data.SqlClient;
using Excel;
using Word;
using System.IO;
namespace Common
{
 /// <summary>
 /// 把数据导入到.doc、.txt、.xls文件中
 /// </summary>
 public class Export
 {
  private const string DATAWORDPATH = @”C:folderdocdatadoc”;
  private const string IMAGEWORDPATH = @”C:folderdocimagedoc”;
  private const string IMAGEPATH = @”C:folderimage”;
  private const string EXCELPATH = @”C:folderexcel”;
  private const string TXTPATH = @”C:foldertxt”;
  private const string IMAGEPOSTFIX = “.bmp”;
  private const string WORDPOSTFIX = “.doc”;
  private const string EXCELPOSTFIX = “.xls”;
  private const string TXTPOSTFIX = “.txt”;
  private const int DATADISTANCE = 5;
  private const int TABDISTANCE = 8;
 
  public Export()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

WinForm应用程序中实现自动更新功能

 

编写人:左丘文

 

2015-4-20

近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因程序的bug而带来频繁让用户更新程序的不良影响,就想给ECM增加一个winform自动更新功能,今天在这里,我想与大家一起分享代码,在此做个小结,以供参考。有兴趣的同学,可以一同探讨与学习一下,否则就略过吧。

 

1、 首先我们在这里先分析一下其它程序猿的一些基本情况:

相信有许多程序猿都喜欢用Winform做开发吧?!因为Winform相对Webform而言,优点是,功能更强大,编程更方便.但是它的缺点,就是软件的安装及维护是相当麻烦地,要实现软件更新,需要到客户端一台一台地升级。

长期以来,广大程序猿为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素。有很多企业用户就是因为这个原因而放弃使用C/S。然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级。现在好了,我们的目标很简单,我们希望开发一个与具体应用无关的能够复用的自动升级系统。下面我为大家提供了一套可复用的用C#实现在线升级。这里分为本地在线升级,也可以利用webservice
在线通过互联网与软件开商的服务器在线升级。

 

2、 实现软件自动在线升级的原理

1)        
写三个程序,一个是主程序;两个是升级程序;所有升级任务都由升级程序完成

原本只需要一个升级程序,但在这里,由于我们另外还涉及到了,在线与软件供应商服务器更新功能,因此我们这里用到了一个主程序两个升级程序。

2)        
很多人实行的原理是将现有版本与最新版本作比较,发现最新的则提示用户是否升级,当然也有人用其它属性比较的,例如:文件大小或者更新日期。我们这里主要利用FileUtil的两个属性SHA1File与MD5File来判断,与服务器之间是否存在版本差异,存在就更新。

3)        
我们的程序,刚开始初始版本是我一同事利用了三天时间,大致写了一个框架出来,我是在他的基础上,对其进行了完善,如增加了对文件流的压缩与解压缩功能,方便进行网络的传输,增加了通过webservices的在线更新功能。并将程序做到通用功能,并嵌套到了我们的ECM系统中。

3、 软件更新操作界面:

1)  
启动我们的主程序ECM

       图片 1 

2)  
系统会从数据库中检查是否有新版本,点点【否】会直接进入系统,点【是】系统会进入到更新介面:

先择需要更新的内容,点击更新,系统会自动更新相关程序。

     图片 2 

3)  
与软件供应商服务器在线更新介面:

操作类似于在线本地更新一样。

 图片 3

具体就需要各位好好的自已去调试了。

4、 更新程序的代码:

1)  
我们的更新程序是以文件流的形式存放在数据库中,因此我们首先需要为系统数据库增加相关的表,用于存储更新文件。

图片 4图片 5

–建立相关表

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[SysUpdate](

[ID] [int] IDENTITY(1,1) NOT NULL,

[FileName] [varchar](250) NULL,

[FileVersion] [varchar](50) NULL,

[FilePath] [varchar](250) NULL,

[FileData] [varbinary](max) NULL,

[FileSize] [varchar](250) NULL,

[FileDate] [varchar](250) NULL,

[FileType] [varchar](50) NULL,

[FilesHash] [varchar](max) NULL,

[FilesMD5] [varchar](max) NULL,

[UpdateBit] [bit] NULL,

[RegBit] [bit] NULL

) ON [PRIMARY]

 

GO

SET ANSI_PADDING OFF

–建立插入SP

 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[Insert_UpdateFile] @filename varchar(250),@fileversion varchar(50),@filepath varchar(250),@filesize varchar(250),@filedate varchar(250),@filetype varchar(50),@fileshash varchar(250),@filesmd5 varchar(250),@file varbinary(Max)
as
insert into SysUpdate ([FileName],[FileVersion],[FilePath],[FileSize],[FileDate],[FileType],[UpdateBit],[RegBit],[FilesHash],[FilesMD5],[FileData])
select  @filename,@fileversion,@filepath,@filesize,@filedate,@filetype,1,0,@fileshash,@filesmd5,@file

View Code

2)  
整体程序框架图如下:

     图片 6 

3)  
上传功能代码:

图片 7图片 8

namespace SysUpdate
{
    public partial class frmSysUpdateUp : Form
    {
        private string updateUrl = string.Empty;
        private string tempUpdatePath = string.Empty;
        WinBase.Common W1 = new WinBase.Common();
      
        public frmSysUpdateUp()
        {
            InitializeComponent();
        }
        private void frmSysUpdateUp_Load(object sender, EventArgs e)
        {
            //数据库SysUpdate表 显示需要更新内容
            dgvList.ColumnCount = 9;
            dgvList.AutoGenerateColumns = false;
            DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert(0, newColumn);
            dgvList.Columns.Insert(10, newColumn1);
            dgvList.Columns.Insert(11, newColumn2);
            this.SetdgvListHeadText();
 
            string strSQL41 = “SELECT * FROM SysUpdate order by ID;”;
            DataSet ds = W1.DS(strSQL41, “Sys”);
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
 
            dgvList.Columns[0].Frozen = true;
            dgvList.Columns[1].Frozen = true;
            dgvList.Columns[2].Frozen = true;
            dgvList.Columns[3].Frozen = true;
            //   dgvList.Columns[4].Frozen = true;
        }
 
        private void SetdgvListHeadText()
        {
            dgvList.Columns[0].HeaderText = “选择”;
            dgvList.Columns[0].Width = 50;
            dgvList.Columns[1].HeaderText = “ID”;
            dgvList.Columns[1].Width = 20;
            dgvList.Columns[1].ReadOnly = true;
            dgvList.Columns[2].HeaderText = “组件名”;
            dgvList.Columns[2].Width = 120;
            dgvList.Columns[2].ReadOnly = true;
            dgvList.Columns[3].HeaderText = “版本号”;
            dgvList.Columns[3].Width = 80;
            dgvList.Columns[3].ReadOnly = true;
 
            dgvList.Columns[4].HeaderText = “大小”;
            dgvList.Columns[4].Width = 100;
            dgvList.Columns[4].ReadOnly = true;
            dgvList.Columns[5].HeaderText = “创建日期”;
            dgvList.Columns[5].Width = 150;
            dgvList.Columns[5].ReadOnly = true;
            dgvList.Columns[6].HeaderText = “哈希值”;
            dgvList.Columns[6].Width = 250;
            dgvList.Columns[6].ReadOnly = true;
            dgvList.Columns[7].HeaderText = “MD5值”;
            dgvList.Columns[7].Width = 250;
            dgvList.Columns[7].ReadOnly = true;
            dgvList.Columns[8].HeaderText = “目录”;
            dgvList.Columns[8].Width = 80;
            dgvList.Columns[8].ReadOnly = true;
            dgvList.Columns[9].HeaderText = “文件类型”;
            dgvList.Columns[9].Width = 80;
            dgvList.Columns[9].ReadOnly = true;
            dgvList.Columns[10].HeaderText = “是否更新”;
            dgvList.Columns[10].Width = 80;
           // dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[11].HeaderText = “是否需要注册”;
            dgvList.Columns[11].Width = 110;
            //dgvList.Columns[11].ReadOnly = true;
        }
 
        private string Byte2String(byte[] arrByte)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in arrByte)
            {
                sb.Append(b > 15 ? Convert.ToString(b, 16) : ‘0’ + Convert.ToString(b, 16));
            }
            return sb.ToString();
        }
        private void DataBinding()
        {
 
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
          
            dgvList.Columns[0].DataPropertyName = “Check1”;
            dgvList.Columns[1].DataPropertyName = “ID”;
            dgvList.Columns[2].DataPropertyName = “FileName”;
            dgvList.Columns[3].DataPropertyName = “FileVersion”;
          
            dgvList.Columns[4].DataPropertyName = “FileSize”;
            dgvList.Columns[5].DataPropertyName = “FileDate”;
            dgvList.Columns[6].DataPropertyName = “FilesHash”;
            dgvList.Columns[7].DataPropertyName = “FilesMD5”;
            dgvList.Columns[8].DataPropertyName = “FilePath”;
            dgvList.Columns[9].DataPropertyName = “FileType”;
            dgvList.Columns[10].DataPropertyName = “UpdateBit”;
            dgvList.Columns[11].DataPropertyName = “RegBit”;
        }
 
        private void ListDate()
        {
            string strSQL41 = “SELECT * FROM SysUpdate order by ID ;”;
            DataSet ds = W1.DS(strSQL41, “Sys”);
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
        }
 
        private void btnUpload_Click(object sender, EventArgs e)
        {
            txtFileText.Text = “”;
            openFileDialog1.InitialDirectory = “d:\”;
            openFileDialog1.Filter = “文件(*.*)|*.*”;
            openFileDialog1.FilterIndex = 1;
            openFileDialog1.RestoreDirectory = true;
            openFileDialog1.Multiselect = true;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                txtFileText.Text = openFileDialog1.FileName;
                //文件名称
                String S = System.IO.Path.GetFileName(openFileDialog1.FileName);
 
                //文件格式
                //  String FileType = System.IO.Path.GetExtension(openFileDialog1.FileName);
                string SHA1 = “”;
                string md5 = “”;
 
                SHA1 = FileUtil.SHA1File(txtFileText.Text.ToString());//这个消息摘要可以用来验证数据的完整性
                md5 = FileUtil.MD5File(txtFileText.Text.ToString());
 
                try
                {
                    if (FileUtil.IsInUse(txtFileText.Text.ToString()))
                    {
                        MessageBox.Show(“文件已经使用中,无法上传!”, “错误提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
 
                    if (FileUtil.FileIsReadOnly(txtFileText.Text.ToString()))
                    {
                        FileUtil.SetFileReadonly(txtFileText.Text.ToString(), false);
                    }
                    FileStream fs = new FileStream(txtFileText.Text.ToString(), FileMode.Open);
                    int streamLength = (int)fs.Length;      //获取文件流的长度。  
                    byte[] image = new byte[streamLength];  //声明字节数组,用于保存图片文件  
                    fs.Read(image, 0, streamLength);        //把图片文件转换成为字节数组保存
                    fs.Close();
                    //文件版本号
                    FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(txtFileText.Text.ToString());
                    FileInfo file = new FileInfo(txtFileText.Text.ToString());
                  //  byte[] args0 = Common.SharpZip.CompressB(image);
                    byte[] args0 = Common.SharpZip.ICGzipCompress(image);
 
                    //创建文件流,path参数是文件路径  
                    string strSQL2 = “exec Insert_UpdateFile ‘” + S + “‘,'” + fileVersion.FileVersion + “‘,”,'” + file.Length + “‘,'” + file.CreationTime + “‘,'” + file.Extension + “‘,'” + SHA1 + “‘,'” + md5 + “‘,0x” + Byte2String(args0) + “”;
                    //string strSQL2 = “exec Insert_UpdateFile ‘” + S + “‘,'” + fileVersion.FileVersion + “‘,”,'” + file.Length + “‘,'” + file.CreationTime + “‘,'” + file.Extension + “‘,'” + SHA1 + “‘,'” + md5 + “‘,0x” + Byte2String(image) + “”;
 
                    int k = W1.DC(strSQL2, “Sys”);
 
                   if (k>0)
                    {
                        MessageBox.Show(“成功!”, “成功提示!”, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show(“失败!”, “错误提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }          
 
                }
                catch
                {
 
                    MessageBox.Show(“文件插入数据库失败!文件可能正在占用!!”,”错误提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
 
                ListDate();
 
            }
 
         
        }
 
        private void dgvList_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            txtID.Text = dgvList[1, e.RowIndex].Value.ToString();
            txtFilePath.Text = dgvList[8, e.RowIndex].Value.ToString();
            chkUpdateBit.Checked = Convert.ToBoolean(dgvList[10, e.RowIndex].Value);
            chkRegBit.Checked = Convert.ToBoolean(dgvList[11, e.RowIndex].Value);
        }
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
 
        }
 
        private void btnSave_Click(object sender, EventArgs e)
        {
 
            string strSQL2 = “Update SysUpdate set FilePath='” + txtFilePath.Text + “‘,UpdateBit='” + Convert.ToBoolean(chkUpdateBit.Checked) + “‘,RegBit='” + Convert.ToBoolean(chkRegBit.Checked) + “‘ where ID='” + txtID.Text + “‘;  “;
            int k = W1.DC(strSQL2, “Sys”);
            if (k > 0)
            {
                MessageBox.Show(“更新成功!”, “成功提示!”, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show(“更新失败!”, “错误提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ListDate();
 
        }
 
        private void btnDel_Click(object sender, EventArgs e)
        {
            string strSQL2 = “DELETE SysUpdate Where ID='” + txtID.Text + “‘;  “;
            int k = W1.DC(strSQL2, “Sys”);
 
            if (k > 0)
            {
                MessageBox.Show(“删除成功!”, “成功提示!”, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show(“删除失败!”, “错误提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ListDate();
        }
 
        private void dgvList_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < this.dgvList.Rows.Count; )
            {
                this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue(“config.xml”, “Color”, “IMColor”))); ;// pParentWin.globalcolor2;
                i += 2;
            }
        }
 
 
        ///<summary>
        /// 序列化
        /// </summary>
        /// <param name=”data”>要序列化的对象</param>
        /// <returns>返回存放序列化后的数据缓冲区</returns>
        public static byte[] Serialize(object data)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream rems = new MemoryStream();
            formatter.Serialize(rems, data);
            return rems.GetBuffer();
        }
 
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name=”data”>数据缓冲区</param>
        /// <returns>对象</returns>
        public static object Deserialize(byte[] data)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream rems = new MemoryStream(data);
            data = null;
            return formatter.Deserialize(rems);
        }
    }
}

View Code

4)  
本地在线更新功能代码:

图片 9图片 10

namespace SysUpdate
{
    public partial class frmLocalUpdate :Form
    {
 
     
        private string updateUrl = string.Empty;
        private string tempUpdatePath = string.Empty;
        WinBase.Common W1 = new WinBase.Common();
       // private ECM.frmMain pParentWin = null;
    
        bool isRun = false;
        bool isUpdate = false;
        string mainAppExe = “”;
     
 
       // public frmLocalUpdate(ECM.frmMain WinMain)
         public frmLocalUpdate()
        {
            InitializeComponent();
           // pParentWin = WinMain;
        }
        private void FrmSysUpdate_Load(object sender, EventArgs e)
        {
            //数据库SysUpdate表 显示需要更新内容
            dgvList.ColumnCount = 10;
            dgvList.AutoGenerateColumns = false;
            DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert(0, newColumn);
            dgvList.Columns.Insert(11, newColumn1);
            dgvList.Columns.Insert(12, newColumn2);
            this.SetdgvListHeadText();
 
            string strSQL41 = “SELECT * FROM SysUpdate order by ID ;”;
            DataSet ds = W1.DS(strSQL41,”Sys”);
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
 
            dgvList.Columns[0].Frozen = true;
            dgvList.Columns[1].Frozen = true;
            dgvList.Columns[2].Frozen = true;
            dgvList.Columns[3].Frozen = true;
            //   dgvList.Columns[4].Frozen = true;
            DataCheck();
 
        }
 
        private void SetdgvListHeadText()
        {
            dgvList.Columns[0].HeaderText = “选择”;
            dgvList.Columns[0].Width = 50;
            dgvList.Columns[1].HeaderText = “ID”;
            dgvList.Columns[1].Width = 20;
            dgvList.Columns[1].ReadOnly = true;
            dgvList.Columns[2].HeaderText = “组件名”;
            dgvList.Columns[2].Width = 120;
            dgvList.Columns[2].ReadOnly = true;
            dgvList.Columns[3].HeaderText = “服务器版本号”;
            dgvList.Columns[3].Width = 120;
            dgvList.Columns[3].ReadOnly = true;
 
            dgvList.Columns[4].HeaderText = “本地版本号”;
            dgvList.Columns[4].Width = 120;
            dgvList.Columns[4].ReadOnly = true;
 
            dgvList.Columns[5].HeaderText = “大小”;
            dgvList.Columns[5].Width = 100;
            dgvList.Columns[5].ReadOnly = true;
            dgvList.Columns[6].HeaderText = “创建日期”;
            dgvList.Columns[6].Width = 150;
            dgvList.Columns[6].ReadOnly = true;
            dgvList.Columns[7].HeaderText = “哈希值”;
            dgvList.Columns[7].Width = 250;
            dgvList.Columns[7].ReadOnly = true;
            dgvList.Columns[8].HeaderText = “MD5值”;
            dgvList.Columns[8].Width = 250;
            dgvList.Columns[8].ReadOnly = true;
            dgvList.Columns[9].HeaderText = “目录”;
            dgvList.Columns[9].Width = 80;
            dgvList.Columns[9].ReadOnly = true;
            dgvList.Columns[10].HeaderText = “文件类型”;
            dgvList.Columns[10].Width = 80;
            dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[11].HeaderText = “是否更新”;
            dgvList.Columns[11].Width = 80;
            // dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[12].HeaderText = “是否需要注册”;
            dgvList.Columns[12].Width = 110;
            //dgvList.Columns[11].ReadOnly = true;
        }
 
 
        private void DataBinding()
        {
 
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            dgvList.Columns[0].DataPropertyName = “Check1”;
            dgvList.Columns[1].DataPropertyName = “ID”;
            dgvList.Columns[2].DataPropertyName = “FileName”;
            dgvList.Columns[3].DataPropertyName = “FileVersion”;
 
            dgvList.Columns[5].DataPropertyName = “FileSize”;
            dgvList.Columns[6].DataPropertyName = “FileDate”;
            dgvList.Columns[7].DataPropertyName = “FilesHash”;
            dgvList.Columns[8].DataPropertyName = “FilesMD5”;
            dgvList.Columns[9].DataPropertyName = “FilePath”;
            dgvList.Columns[10].DataPropertyName = “FileType”;
            dgvList.Columns[11].DataPropertyName = “UpdateBit”;
            dgvList.Columns[12].DataPropertyName = “RegBit”;
        }
 
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
            // Application.ExitThread();
            // Application.Exit();
        }
 
        private void DataCheck()
        {
            //检查是否更新文件
            if (dgvList.Rows.Count != 0)
            {
                for (int i = 0; i < dgvList.Rows.Count; i++)
                {
                  string fileName = “”;
                    string strg = “”;
                    fileName = dgvList.Rows[i].Cells[2].Value.ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (dgvList.Rows[i].Cells[9].Value.ToString() != “”)
                    {
                        strg += “\” + dgvList.Rows[i].Cells[9].Value.ToString();//添加路径信息
                    }
                    strg += “\” + fileName;//添加文件名称
 
                    //检查文件是否存在
                    //文件版本号
                 
                   // FileInfo file = new FileInfo(strg);
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[8].Value.ToString()))
                        {
                            dgvList.Rows[i].Cells[0].Value = false;
                          
                        }
                        else
                        {
                            dgvList.Rows[i].Cells[0].Value = true;
                        }
                        FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
                        dgvList.Rows[i].Cells[4].Value = fileVersion.FileVersion;
                    }
                    else
                    {
                        dgvList.Rows[i].Cells[0].Value = true;
                        dgvList.Rows[i].Cells[4].Value = “文件不存在”;
                    }
                  
                }
            }
        }
 
 
    
 
        private delegate void SetProgressVlue(int value);
        private void SetValue(int value) //执行2次,第一次IF,第2次ELSE
        {
            if (this.InvokeRequired) //是否处于控件线程外
            {
                SetProgressVlue d = new SetProgressVlue(SetValue); //创建一个SetProgressVlue的委托实例d,并将SetVlue赋值
 
                object arg = value; //给参数的值
                this.Invoke(d, arg); //将该值传递给D
            }
            else
            {
                this.pbDownFile.Value += value;
            }
        }
 
 
 
        private void btnNext_Click(object sender, EventArgs e)
        {
             if (dgvList.Rows.Count == 0)
             {
                  MessageBox.Show(“没有可用的更新!”, “自动更新”, MessageBoxButtons.OK, MessageBoxIcon.Information);
                  return;
             }
             for (int i = 0; i < dgvList.Rows.Count; i++)
             {
                 if (dgvList.Rows[i].Cells[0].Value == null)  //第一次都是null
                 {
                     dgvList.Rows[i].Cells[0].Value = false;
 
                 }
                 if ((dgvList.Rows[i].Cells[0].Value.ToString()) == “True”)
                 {
                     isUpdate = true;
                 }
             }
             if (isUpdate==false)     
             {
                 MessageBox.Show(“没有可用的更新!”, “自动更新”, MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
            this.pbDownFile.Value = 0;
            string strSQL41 = “SELECT * FROM SysUpdate where UpdateBit=1 order by ID;”;
            DataSet ds = W1.DS(strSQL41,”Sys”);
            //检查目录对应文件MD5是否一样,
            //如果一样表示已经更新无需更新
            if (ds.Tables[0].Rows.Count >= 1)
            {
                pbDownFile.Maximum = ds.Tables[0].Rows.Count;
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    SetValue(1);
                    string fileName = “”;
                    string strg = “”;
                    fileName = ds.Tables[0].Rows[i][“FileName”].ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (ds.Tables[0].Rows[i][“FilePath”].ToString() != “”)
                    {
                        strg += “\” + ds.Tables[0].Rows[i][“FilePath”].ToString();//添加路径信息
                    }
                    strg += “\” + fileName;//添加文件名称
 
                    //检查文件是否存在
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[0].Rows[i][“FilesMD5”].ToString()))
                        {
 
                        }
                        else
                        {
                            CloseMainExe();
                            //删除当前文件
                            FileUtil.DeleteFile(strg);
                            byte[] MyData2 = new byte[0];
                            MyData2 = (byte[])ds.Tables[0].Rows[i][“FileData”];
                            byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);//解压
                            //MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                            FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(args0, 0, args0.Length);
                            fs.Close();
                            //是否注册
                            if (ds.Tables[0].Rows[i][“RegBit”].ToString() == “True”)
                            {
                                Process p = new Process();
                                p.StartInfo.FileName = “Regsvr32.exe”;
                                p.StartInfo.Arguments = “/s ” + strg;//
                            }
 
 
                        }
                    }
                    else
                    {
 
                        string DirectoryStrg = Application.StartupPath.ToString();//得到应用程序路径信息    
                        if (ds.Tables[0].Rows[i][“FilePath”].ToString() != “”)
                        {
                            DirectoryStrg += “\” + ds.Tables[0].Rows[i][“FilePath”].ToString();//添加路径信息
                        }
 
                        if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
                        {
                        }
                        else
                        {
                            DirectoryUtil.CreateDirectory(DirectoryStrg);
                        }
 
                        byte[] MyData2 = new byte[0];
                        MyData2 = (byte[])ds.Tables[0].Rows[i][“FileData”];
                        byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
                       // MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                        FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(args0, 0, args0.Length);
                        fs.Close();
 
                        if (ds.Tables[0].Rows[i][“RegBit”].ToString() == “True”)
                        {
                            Process p = new Process();
                            p.StartInfo.FileName = “Regsvr32.exe”;
                            p.StartInfo.Arguments = “/s ” + strg;//
                        }
 
                    }
 
                }
                DataCheck();
                panel2.Location = panel1.Location;
                panel2.Size = panel1.Size;
                panel1.Visible = false;
                panel2.Visible = true;
                btnNext.Visible = false;
                StarMainExe();
                Application.Exit();
            }
 
        }
 
        private void CloseMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + “\UpdateList.xml”;
                isRun = W1.LoadXmlFileValue(“UpdateList.xml”, “Application”, “AllowStart”).ToLower() == “true” ? true : isRun;
                mainAppExe = W1.LoadXmlFileValue(“UpdateList.xml”, “Application”, “AppName”);
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(“.exe”, “”));
                for (int i = 0; i < processesByName.Length; i++)
                {
                    Process p = processesByName[i];
                    for (int j = 0; j < p.Threads.Count; j++)
                    {
                        p.Threads[j].Dispose();
                    }
                    p.Kill();
                    if (i == processesByName.Length – 1) Thread.Sleep(550);
 
                }
 
            }
            catch
            {
                MessageBox.Show(“关闭运行中的进程发生错误,请联系管理员!”, “系统提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //finally
            //{
            //    this.Close();
            //    this.Dispose();
            //    //  Application.ExitThread();
            //    //  Application.Exit();
            //}
        }
 
        private void StarMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + “\UpdateList.xml”;
                isRun = false;
                mainAppExe = W1.LoadXmlFileValue(“UpdateList.xml”, “Application”, “AppName”);
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(“.exe”, “”));
                for (int i = 0; i < processesByName.Length; i++)
                {
                  if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
                  {
                      isRun = true;
                      break;
                  }
 
                }
 
                if (false == this.isRun) Process.Start(mainAppExe);
 
            }
            catch
            {
                MessageBox.Show(“重启主程序发生错误,请联系管理员!”, “系统提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Close();
                this.Dispose();
                //  Application.ExitThread();
                //  Application.Exit();
            }
 
        }
        private void dgvList_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < this.dgvList.Rows.Count; )
            {
                this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue(“config.xml”, “Color”, “IMColor”))); ;// pParentWin.globalcolor2;
                i += 2;
            }
        }
      
 
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            string strSQL41 = “SELECT * FROM SysUpdate order by ID ;”;
            DataSet ds = W1.DS(strSQL41,”Sys”);
            dgvList.DataSource = ds.Tables[0].DefaultView;
            this.DataBinding();
            DataCheck();
        }
 
     
        private SysUpdate.frmSysUpdateUp frmsysupdateup = null;
        private void OpenUpload()
        {
            if (FindFormName(“frmSysUpdateUp”) == null)
            {
                frmsysupdateup = new SysUpdate.frmSysUpdateUp(); ;
                frmsysupdateup.Show();
                frmsysupdateup.Focus();
            }
            else
            {
                Form f = FindFormName(“frmSysUpdateUp”) as Form;
                f.Focus();
            }
        }
        /// <summary>在OpenForms中查找已经打开的窗口 </summary>     
        /// <param name=”text”>传入的窗口名称</param>      
        /// <returns>返回的窗口</returns>   
        private Form FindFormName(string name)
        {
            foreach (Form form in Application.OpenForms)
                //窗口名称
                if (form.Name == name)
                    return form;
            return null;
        }
 
      
        private void frmLocalUpdate_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((Control.ModifierKeys & Keys.Control) == Keys.Control && e.KeyChar==19)
            {
                OpenUpload();
            }
        }
        //protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        //{
        //    if ((keyData & Keys.Alt) == Keys.Alt)//检测到alt
        //    {
        //        if ((keyData & Keys.Control) == Keys.Control)
        //        {
        //            System.Windows.Forms.SendKeys.Send(“^%”);
        //            return true;
        //        }
        //    }
        //    return base.ProcessCmdKey(ref msg, keyData);
        //}
    
 
 
    }
}

View Code

5)  
通过webservice在线更新功能代码:

图片 11图片 12

namespace SysUpdate
{
    public partial class frmOnlineUpdate : Form
    {
 
      
        private string updateUrl = string.Empty;
        private string tempUpdatePath = string.Empty;
        WinBase.Common W1 = new WinBase.Common();
      
        DataSet ds1 = new DataSet();
        bool isRun = false;
        bool isUpdate = false;
        string mainAppExe = “”;
      
 
        public frmOnlineUpdate()
        {
            InitializeComponent();
          
        }
        private void frmOnlineUpdate_Load(object sender, EventArgs e)
        {
            //数据库SysUpdate表 显示需要更新内容
            dgvList.ColumnCount = 10;
            dgvList.AutoGenerateColumns = false;
            DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert(0, newColumn);
            dgvList.Columns.Insert(11, newColumn1);
            dgvList.Columns.Insert(12, newColumn2);
            this.SetdgvListHeadText();
 
 
 
            string localXmlFile = Application.StartupPath + “\UpdateList.xml”;
            txtAddress.Text = W1.LoadXmlFileValue(“UpdateList.xml”, “Updater”, “Url”);          
            Down();
            dgvList.DataSource = ds1.Tables[0].DefaultView;
            this.DataBinding();
 
            dgvList.Columns[0].Frozen = true;
            dgvList.Columns[1].Frozen = true;
            dgvList.Columns[2].Frozen = true;
            dgvList.Columns[3].Frozen = true;
            //   dgvList.Columns[4].Frozen = true;
            DataCheck();
 
        }
        private void Down()
        {
            string url = txtAddress.Text;
            #region 从服务器获取更新列表
 
            object result = WebServicesHelper.InvokeWebService(url, “GetUpdateFile”, null);
            byte[] tb = (byte[])result;
            object[] ob = Common.SharpZip.DecompressNew(tb);
            DataTable[] tb2 = (DataTable[])ob;
 
            for (int i = 0; i < tb2.Length; i++)
            {
                ds1.Tables.Add(tb2[i]);
            }
            #endregion
        }
           
 
          private void SetdgvListHeadText()
        {
            dgvList.Columns[0].HeaderText = “选择”;
            dgvList.Columns[0].Width = 50;
            dgvList.Columns[1].HeaderText = “ID”;
            dgvList.Columns[1].Width = 20;
            dgvList.Columns[1].ReadOnly = true;
            dgvList.Columns[2].HeaderText = “组件名”;
            dgvList.Columns[2].Width = 120;
            dgvList.Columns[2].ReadOnly = true;
            dgvList.Columns[3].HeaderText = “服务器版本号”;
            dgvList.Columns[3].Width = 120;
            dgvList.Columns[3].ReadOnly = true;
 
            dgvList.Columns[4].HeaderText = “本地版本号”;
            dgvList.Columns[4].Width = 120;
            dgvList.Columns[4].ReadOnly = true;
 
            dgvList.Columns[5].HeaderText = “大小”;
            dgvList.Columns[5].Width = 100;
            dgvList.Columns[5].ReadOnly = true;
            dgvList.Columns[6].HeaderText = “创建日期”;
            dgvList.Columns[6].Width = 150;
            dgvList.Columns[6].ReadOnly = true;
            dgvList.Columns[7].HeaderText = “哈希值”;
            dgvList.Columns[7].Width = 250;
            dgvList.Columns[7].ReadOnly = true;
            dgvList.Columns[8].HeaderText = “MD5值”;
            dgvList.Columns[8].Width = 250;
            dgvList.Columns[8].ReadOnly = true;
            dgvList.Columns[9].HeaderText = “目录”;
            dgvList.Columns[9].Width = 80;
            dgvList.Columns[9].ReadOnly = true;
            dgvList.Columns[10].HeaderText = “文件类型”;
            dgvList.Columns[10].Width = 80;
            dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[11].HeaderText = “是否更新”;
            dgvList.Columns[11].Width = 80;
            // dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[12].HeaderText = “是否需要注册”;
            dgvList.Columns[12].Width = 110;
            //dgvList.Columns[11].ReadOnly = true;
        }
 
 
        private void DataBinding()
        {
 
            // ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            dgvList.Columns[0].DataPropertyName = “Check1”;
            dgvList.Columns[1].DataPropertyName = “ID”;
            dgvList.Columns[2].DataPropertyName = “FileName”;
            dgvList.Columns[3].DataPropertyName = “FileVersion”;
 
            dgvList.Columns[5].DataPropertyName = “FileSize”;
            dgvList.Columns[6].DataPropertyName = “FileDate”;
            dgvList.Columns[7].DataPropertyName = “FilesHash”;
            dgvList.Columns[8].DataPropertyName = “FilesMD5”;
            dgvList.Columns[9].DataPropertyName = “FilePath”;
            dgvList.Columns[10].DataPropertyName = “FileType”;
            dgvList.Columns[11].DataPropertyName = “UpdateBit”;
            dgvList.Columns[12].DataPropertyName = “RegBit”;
        }
 
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
            // Application.ExitThread();
            // Application.Exit();
        }
 
        private void DataCheck()
        {
            //检查是否更新文件
            if (dgvList.Rows.Count != 0)
            {
                for (int i = 0; i < dgvList.Rows.Count; i++)
                {
                  string fileName = “”;
                    string strg = “”;
                    fileName = dgvList.Rows[i].Cells[2].Value.ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (dgvList.Rows[i].Cells[9].Value.ToString() != “”)
                    {
                        strg += “\” + dgvList.Rows[i].Cells[9].Value.ToString();//添加路径信息
                    }
                    strg += “\” + fileName;//添加文件名称
 
                    //检查文件是否存在
                    //文件版本号
                 
                   // FileInfo file = new FileInfo(strg);
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[8].Value.ToString()))
                        {
                            dgvList.Rows[i].Cells[0].Value = false;
                           
                        }
                        else
                        {
                            dgvList.Rows[i].Cells[0].Value = true;
                        }
                        FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
                        dgvList.Rows[i].Cells[4].Value = fileVersion.FileVersion;
                    }
                    else
                    {
                        dgvList.Rows[i].Cells[0].Value = true;
                        dgvList.Rows[i].Cells[4].Value = “文件不存在”;
                    }
                  
                }
            }
        }
 
 
    
 
        private delegate void SetProgressVlue(int value);
        private void SetValue(int value) //执行2次,第一次IF,第2次ELSE
        {
            if (this.InvokeRequired) //是否处于控件线程外
            {
                SetProgressVlue d = new SetProgressVlue(SetValue); //创建一个SetProgressVlue的委托实例d,并将SetVlue赋值
 
                object arg = value; //给参数的值
                this.Invoke(d, arg); //将该值传递给D
            }
            else
            {
                this.pbDownFile.Value += value;
            }
        }
 
 
 
        private void btnNext_Click(object sender, EventArgs e)
        {
             if (dgvList.Rows.Count == 0)
             {
                  MessageBox.Show(“没有可用的更新!”, “自动更新”, MessageBoxButtons.OK, MessageBoxIcon.Information);
                  return;
             }
             for (int i = 0; i < dgvList.Rows.Count; i++)
             {
                 if (dgvList.Rows[i].Cells[0].Value == null)  //第一次都是null
                 {
                     dgvList.Rows[i].Cells[0].Value = false;
 
                 }
                 if ((dgvList.Rows[i].Cells[0].Value.ToString()) == “True”)
                 {
                     isUpdate = true;
                 }
             }
             if (isUpdate==false)     
             {
                 MessageBox.Show(“没有可用的更新!”, “自动更新”, MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
            this.pbDownFile.Value = 0;
            string strSQL41 = “SELECT * FROM SysUpdate where UpdateBit=1 order by ID;”;
            DataSet ds = W1.DS(strSQL41,”Sys”);
            //检查目录对应文件MD5是否一样,
            //如果一样表示已经更新无需更新
            if (ds.Tables[0].Rows.Count >= 1)
            {
                pbDownFile.Maximum = ds.Tables[0].Rows.Count;
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    SetValue(1);
                    string fileName = “”;
                    string strg = “”;
                    fileName = ds.Tables[0].Rows[i][“FileName”].ToString();
                    strg = Application.StartupPath.ToString();//得到应用程序路径信息    
                    if (ds.Tables[0].Rows[i][“FilePath”].ToString() != “”)
                    {
                        strg += “\” + ds.Tables[0].Rows[i][“FilePath”].ToString();//添加路径信息
                    }
                    strg += “\” + fileName;//添加文件名称
                  
                    //检查文件是否存在
                    if (FileUtil.IsExistFile(strg))
                    {
                        if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[0].Rows[i][“FilesMD5”].ToString()))
                        {
 
                        }
                        else
                        {
                            CloseMainExe();
                            //删除当前文件
                            FileUtil.DeleteFile(strg);
                            byte[] MyData2 = new byte[0];
                            MyData2 = (byte[])ds.Tables[0].Rows[i][“FileData”];
                            byte[] args0 = Common.SharpZip.DecompressB(MyData2);//解压
                            //MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                            FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(args0, 0, args0.Length);
                            fs.Close();
                            //是否注册
                            if (ds.Tables[0].Rows[i][“RegBit”].ToString() == “True”)
                            {
                                Process p = new Process();
                                p.StartInfo.FileName = “Regsvr32.exe”;
                                p.StartInfo.Arguments = “/s ” + strg;//
                            }
 
 
                        }
                    }
                    else
                    {
 
                        string DirectoryStrg = Application.StartupPath.ToString();//得到应用程序路径信息    
                        if (ds.Tables[0].Rows[i][“FilePath”].ToString() != “”)
                        {
                            DirectoryStrg += “\” + ds.Tables[0].Rows[i][“FilePath”].ToString();//添加路径信息
                        }
 
                        if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
                        {
                        }
                        else
                        {
                            DirectoryUtil.CreateDirectory(DirectoryStrg);
                        }
 
                        byte[] MyData2 = new byte[0];
                        MyData2 = (byte[])ds.Tables[0].Rows[i][“FileData”];
                        byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
                       // MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2));//解压
                        FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(args0, 0, args0.Length);
                        fs.Close();
 
                        if (ds.Tables[0].Rows[i][“RegBit”].ToString() == “True”)
                        {
                            Process p = new Process();
                            p.StartInfo.FileName = “Regsvr32.exe”;
                            p.StartInfo.Arguments = “/s ” + strg;//
                        }
                       
                    }
 
                }
                DataCheck();
                panel2.Location = panel1.Location;
                panel2.Size = panel1.Size;
                panel1.Visible = false;
                panel2.Visible = true;
                btnNext.Visible = false;
                StarMainExe();
                Application.Exit();
            }
 
        }
 
        private void CloseMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + “\UpdateList.xml”;
                isRun = W1.LoadXmlFileValue(“UpdateList.xml”, “Application”, “AllowStart”).ToLower() == “true” ? true : isRun;
                mainAppExe = W1.LoadXmlFileValue(“UpdateList.xml”, “Application”, “AppName”);
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(“.exe”, “”));
                for (int i = 0; i < processesByName.Length; i++)
                {
                    Process p = processesByName[i];
                    for (int j = 0; j < p.Threads.Count; j++)
                    {
                        p.Threads[j].Dispose();
                    }
                    p.Kill();
                    if (i == processesByName.Length – 1) Thread.Sleep(550);
 
                }
              
            }
            catch
            {
                MessageBox.Show(“关闭运行中的进程发生错误,请联系管理员!”, “系统提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //finally
            //{
            //    this.Close();
            //    this.Dispose();
            //  //  Application.ExitThread();
            //  //  Application.Exit();
            //}
        }
 
        private void StarMainExe()
        {
            try
            {
                string localXmlFile = Application.StartupPath + “\UpdateList.xml”;
                isRun = false;
                mainAppExe = W1.LoadXmlFileValue(“UpdateList.xml”, “Application”, “AppName”);
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace(“.exe”, “”));
                for (int i = 0; i < processesByName.Length; i++)
                {
                    if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
                    {
                        isRun = true;
                        break;
                    }
 
                }
 
                if (true == this.isRun) Process.Start(mainAppExe);
 
            }
            catch
            {
                MessageBox.Show(“重启主程序发生错误,请联系管理员!”, “系统提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Close();
                this.Dispose();
                //  Application.ExitThread();
                //  Application.Exit();
            }
 
        }
 
        private void dgvList_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < this.dgvList.Rows.Count; )
            {
                this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue(“config.xml”, “Color”, “IMColor”))); ;// pParentWin.globalcolor2;//System.Drawing.Color.FromArgb(Convert.ToInt32(-2302756));//
                i += 2;
            }
        }
      
 
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            Down();
            dgvList.DataSource = ds1.Tables[0].DefaultView;
            this.DataBinding();
            DataCheck();
        }
      
 
 
    }
}

View Code

6)  
软件商webserice代码

图片 13图片 14

namespace HostWebService
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
   // [WebService(Namespace = “]
    [WebService(Namespace = “]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]

    public class HostService : System.Web.Services.WebService
    {
        WebBase W1 = new WebBase();
        #region WebService Get Method
        
       
        [WebMethod(Description = “取得服务器上的相关更新资料DataSet”)]
        public byte[] GetUpdateFile()
        {
            string strSQL = “SELECT * FROM SysUpdate where UpdateBit=1 order by ID;”;
            DataSet ds = W1.DS(strSQL, “Sys”);
            DataTable[] tb = new DataTable[ds.Tables.Count];
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                tb[i] = ds.Tables[i];

            }
            return Common.SharpZip.Compress(tb);
        }
      
       
        #endregion

        #region WebService Post Method
      
        [WebMethod(Description = “更新相关文件”)]
        public int UploadUpdateFile(byte[] result)
        {
            int id = 0;
            byte[] tb = (byte[])result;
            object[] ob = Common.SharpZip.DecompressNew(tb);
            DataTable[] tb2 = (DataTable[])ob;
            DataSet ds1 = new DataSet();
            for (int i = 0; i < tb2.Length; i++)
            {
                ds1.Tables.Add(tb2[i]);
            }

            if (ds1.Tables[0].Rows.Count > 0)
            {

                for (int i = 0; i < ds1.Tables[0].Rows.Count; i++)
                {
                    string strSQL = “select * from SysUpdate where ID='” + ds1.Tables[0].Rows[i][0].ToString() + “‘”;
                    DataSet ds10 = W1.DS(strSQL, “Sys”);
                    if (ds10.Tables[0].Rows.Count > 0) //记录已存在时
                    {
                        strSQL = “Delete from SysUpdate where ID='” + ds1.Tables[0].Rows[i][0].ToString() + “‘; Insert into SysUpdate values(“;
                        for (int j = 0; j < ds1.Tables[0].Columns.Count – 1; j++)
                        {
                            if (ds1.Tables[0].Columns[j].DataType.ToString() == “System.Double” || ds1.Tables[0].Columns[j].DataType.ToString() == “System.Decimal”)  //Double型的要特别处理,不能看成字符型
                            {
                                if (ds1.Tables[0].Rows[i][j].ToString() == “”)
                                {

                                    strSQL += “null” + “,”;
                                }
                                else
                                {
                                    strSQL += ds1.Tables[0].Rows[i][j].ToString() + “,”;
                                }
                            }
                            else
                            {
                                strSQL += “‘” + ds1.Tables[0].Rows[i][j].ToString() + “‘,”;
                            }
                        }
                        strSQL += “‘” + ds1.Tables[0].Rows[i][ds1.Tables[0].Columns.Count – 1].ToString() + “‘)”;
                        try
                        {
                            W1.DC(strSQL, “Sys”);
                            id++;

                        }
                        catch
                        {
                            return id = -1;
                        }
                    }
                    else
                    {
                        strSQL = ” Insert into SysUpdate values(“;
                        for (int j = 0; j < ds1.Tables[0].Columns.Count – 1; j++)
                        {
                            if (ds1.Tables[0].Columns[j].DataType.ToString() == “System.Double” || ds1.Tables[0].Columns[j].DataType.ToString() == “System.Decimal”)  //Double型的要特别处理,不能看成字符型
                            {
                                if (ds1.Tables[0].Rows[i][j].ToString() == “”)
                                {

                                    strSQL += “null” + “,”;
                                }
                                else
                                {
                                    strSQL += ds1.Tables[0].Rows[i][j].ToString() + “,”;
                                }
                            }
                            else
                            {
                                strSQL += “‘” + ds1.Tables[0].Rows[i][j].ToString() + “‘,”;
                            }
                        }
                        strSQL += “‘” + ds1.Tables[0].Rows[i][ds1.Tables[0].Columns.Count – 1].ToString() + “‘)”;
                        try
                        {
                            W1.DC(strSQL, “Sys”);
                            id++;

                        }
                        catch
                        {
                            return id = -1;
                        }
                    }
                }

            }

            return id;
        }
      
     
        #endregion

        private void InitializeComponent()
        {
        }
       
    }
}

View Code

7)  
更新配置文件:UpdateList.xml

图片 15图片 16

<?xml version=”1.0″ encoding=”gb2312″?>
<Configs>
  <Updater>
    <Url>; //升级文件所在服务器端的网址  
  </Updater>
  <Application>
    <AllowStart>true</AllowStart> //允许重新启动应用程序
    <AppName>ECM.exe</AppName>  //启动的应用程序名  
  </Application>
</Configs>

View Code

8)  
ECM系统Login时检查是否有更新档功能代码:

图片 17图片 18

  private void CheckUpdate()
        {
             string strSQL41 = “SELECT * FROM SysUpdate where UpdateBit=1 order by ID;”;
             DataSet ds = W1.DS(strSQL41,”Sys”);
            //检查目录对应文件MD5是否一样,
            //如果一样表示已经更新无需更新
             if (ds.Tables[0].Rows.Count >= 1)
             {
                 for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                 {
 
                     string fileName = “”;
                     string strg = “”;
                     fileName = ds.Tables[0].Rows[i][“FileName”].ToString();
                     strg = Application.StartupPath.ToString();//得到应用程序路径信息   
                     if (ds.Tables[0].Rows[i][“FilePath”].ToString() != “”)
                     {
                         strg += “\” + ds.Tables[0].Rows[i][“FilePath”].ToString();//添加路径信息
                     }
                     strg += “\” + fileName;//添加文件名称
 
                     //检查文件是否存在
                     if (SysUpdate.FileUtil.IsExistFile(strg))
                     {
                         if ((SysUpdate.FileUtil.MD5File(strg).ToString()) == (ds.Tables[0].Rows[i][“FilesMD5”].ToString()))
                         {
                         }
                         else
                         {
                             isUpdate = true;
 
                         }
                     }
                     else
                     {
                         isUpdate = true;
                     }
 
                 }
             }
             if (isUpdate)
             {
                 if (MessageBox.Show(“服务器存在更新版本,是否更新为最新版”, “系统提示”, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                 {
                     System.Diagnostics.Process.Start(“SysUpdate.exe”);
                 }
             }
        }

View Code

 

5、 有关更多的技术分享,大家可以加入我们的技术群,进行源码的分享。

 

欢迎加入技术分享群:238916811

 

namespace ImportExportToOffice

  /// <summary>
  /// 获得数据集Dataset——————————–用于调试
  /// </summary>
  /// <returns>Dataset</returns>
  public DataSet GetData()
  {
   try
   {
    string sConnectionString;
    sConnectionString = “workstation id=GUOFU;packet size=4096;user
id=sa;data source=GUOFU;persist security info=True;initial
catalog=YC;password=sc”;
    SqlConnection bjConn = new SqlConnection(sConnectionString);
    objConn.Open();                                          
    SqlDataAdapter daPoint = new SqlDataAdapter(“Select * From Point”,
objConn);
    DataSet dsYC = new DataSet(“YC”);
    daPoint.FillSchema(dsYC,SchemaType.Mapped, “Point”);
    daPoint.Fill(dsYC,”Point”);
    daPoint = new SqlDataAdapter(“Select * From Employee”, objConn);
    daPoint.FillSchema(dsYC,SchemaType.Mapped, “Employee”);
    daPoint.Fill(dsYC,”Employee”);
    return dsYC;
   }
   catch(Exception ex)
   {
    throw new Exception(ex.Message);
   }

{

  }

    using System;

  /// <summary>
  /// 把数据文件导入到.xls文件
  /// </summary>
  /// <param name=”ds”></param>
  public void ExportToExcel(DataSet ds)
  {

    using System.ComponentModel;

   if(ds.Tables.Count!=0)
   {
    //生成.xls文件完整路径名
    string tempFileName = GetTempFileName();
    object filename = EXCELPATH+tempFileName+EXCELPOSTFIX;
    object Nothing = System.Reflection.Missing.Value;
  
 //创建excel文件,文件名用系统时间生成精确到毫秒
    Excel.Application myExcel = new Excel.ApplicationClass();
    myExcel.Application.Workbooks.Add(Nothing);

    using System.Data;

    try
    {
     //把Dataset中的数据插入excel文件中
     int totalCount = 0;
     for(int k =0;k<ds.Tables.Count;k++)
     {
      int row = ds.Tables[k].Rows.Count;
      int column = ds.Tables[k].Columns.Count;
  
      for(int i = 0;i<column;i++)
      {
       myExcel.Cells[totalCount+2,1+i] =
ds.Tables[k].Columns[i].ColumnName;
      }

    using System.Windows.Forms;

      for(int i = 0;i<row;i++)
      {
       for(int j =0;j<column;j++)
       {
        myExcel.Cells[totalCount+3+i,1+j] = “‘” +
ds.Tables[k].Rows[i][j].ToString();
       }
      }
      totalCount = totalCount + row +4;
     }

    public class ImportExportToWord

     try
     {
      //保存excel文件到指定的目录下,文件名用系统时间生成精确到毫秒
     
myExcel.ActiveWorkbook._SaveAs(filename,Nothing,Nothing,Nothing,Nothing,Nothing,XlSaveAsAccessMode.xlExclusive,Nothing,Nothing,Nothing,Nothing);
     }
     catch
     {
     
System.Windows.Forms.MessageBox.Show(“系统找不到指定目录下的文件: 
“+EXCELPATH+tempFileName+EXCELPOSTFIX);
      return;
     }
     //让生成的excel文件可见
     myExcel.Visible = true;
    }
    catch(Exception e)
    {
     System.Windows.Forms.MessageBox.Show(“向excel文件中写入数据出错: 
” + e.Message);
    }
   }
   else
   {
    System.Windows.Forms.MessageBox.Show(“No Data”);
   }
  }

    {

  /// <summary>
  /// 把数据导入到.doc文件
  /// </summary>
  /// <param name=”ds”></param>
  public void ExportToWord(DataSet ds)
  {
   if(ds.Tables.Count!=0)
   { 
    string tempFileName = null;
    object filename = null;
  
    object tableBehavior. =
Word.WdDefaultTableBehavior.wdWord9TableBehavior;
    object autoFitBehavior. = Word.WdAutoFitBehavior.wdAutoFitFixed;

        private Word.ApplicationClass oWordApplic;    

    object unit = Word.WdUnits.wdStory;
    object extend = System.Reflection.Missing.Value;
    object breakType = (int)Word.WdBreakType.wdSectionBreakNextPage;

        private Word.Document oDoc;        

    object count = 1;
    object character = Word.WdUnits.wdCharacter;

        private const string strFileName    = @”F:”;

    object Nothing =  System.Reflection.Missing.Value;
  
    try
    {
     tempFileName = GetTempFileName();

        private const string PostfixForWord    = @”.doc”;

     //生成.doc文件完整路径名
     filename = DATAWORDPATH+tempFileName+WORDPOSTFIX;
   
     //创建一个word文件,文件名用系统时间生成精确到毫秒
     Word.Application myWord= new Word.ApplicationClass();
     Word._Document myDoc = new Word.DocumentClass();
     myDoc = myWord.Documents.Add(ref Nothing,ref Nothing,ref
Nothing,ref Nothing);
     myDoc.Activate();

        private const string PostfixForHtml    = @”.Html”;

     //向把dataset中的表插入到word的文件中
  
     for(int totalTable =
0;totalTable<ds.Tables.Count;totalTable++)
     {
     
myWord.Application.Selection.TypeText(ds.Tables[totalTable].TableName+”表的数据如下”);
      myWord.Application.Selection.TypeParagraph();   
      myWord.Application.Selection.TypeParagraph();
      Word.Range para = myWord.Application.Selection.Range;
     
myDoc.Tables.Add(para,ds.Tables[totalTable].Rows.Count+1,ds.Tables[totalTable].Columns.Count,ref
tableBehavior,ref autoFitBehavior);
      for(int column = 0;
column<ds.Tables[totalTable].Columns.Count;column++)
      {
      
myDoc.Tables.Item(totalTable+1).Cell(1,column+1).Range.InsertBefore(ds.Tables[0].Columns[column].ColumnName.Trim());
      }  
      for(int row = 0;row<ds.Tables[totalTable].Rows.Count;row++)
      {
       for(int column =
0;column<ds.Tables[totalTable].Columns.Count;column++)
       {
       
myDoc.Tables.Item(totalTable+1).Cell(row+2,column+1).Range.InsertBefore(ds.Tables[totalTable].Rows[row][column].ToString().Trim());
       }
      }
      myWord.Application.Selection.EndKey(ref unit,ref extend);
      myWord.Application.Selection.TypeParagraph();
      myWord.Application.Selection.TypeParagraph();
      myWord.Application.Selection.InsertBreak(ref breakType);  
     }
     myWord.Application.Selection.TypeBackspace();
     myWord.Application.Selection.Delete(ref character,ref count);
     myWord.Application.Selection.HomeKey(ref unit,ref extend);
  
     //保存word文件到指定的目录下
     try
     {
      myDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref
Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref
Nothing);
      myWord.Visible = true;
     }
     catch
     {
     
System.Windows.Forms.MessageBox.Show(“系统找不到指定目录下的文件: 
“+DATAWORDPATH+tempFileName+WORDPOSTFIX);
      return;
     }
     //让生成的excel文件可见
     myWord.Visible = true;
    }
    catch(Exception ex)
    {
     System.Windows.Forms.MessageBox.Show(“向word文件中写入数据出错:  “

        构造函数#region 构造函数

  • ex.Message);
        }
       }
       else
       {
        System.Windows.Forms.MessageBox.Show(“No Data”);
       }
      }
      /// <summary>
      /// 把图片文件导入到.doc文件
      /// </summary>
      /// <param name=”bp”></param>
      public void ExportToWord(Bitmap bp)
      {
       string tempFileName = null;
       string bmpPath = null;
       object filename = null;
       object Nothing = null;
       tempFileName = GetTempFileName();

        public ImportExportToWord()

 
   //生成.bmp文件完整路径名
   bmpPath = IMAGEPATH+tempFileName+IMAGEPOSTFIX;

        {

   //生成.doc文件完整路径名
   filename = IMAGEWORDPATH+tempFileName+WORDPOSTFIX;
   Nothing = System.Reflection.Missing.Value;
 
   //创建一个word文件,文件名用系统时间生成精确到毫秒
   Word.Application myWord= new Word.ApplicationClass();
   Word._Document myDoc = new Word.DocumentClass();
   myDoc = myWord.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref
Nothing);

            oWordApplic = new Word.ApplicationClass();

   try
   {
    //把bitmap对象保存到系统所生成文件完整路径中
    bp.Save(bmpPath);
   }
   catch
   {
    System.Windows.Forms.MessageBox.Show(“系统找不到指定目录下的文件: 
“+bmpPath);
    return;
   }
 
   try
   {
    //往word文件中插入图片
    myDoc.InlineShapes.AddPicture(bmpPath,ref Nothing,ref Nothing,ref
Nothing);
   }
   catch
   {
    System.Windows.Forms.MessageBox.Show(“系统找不到指定目录下的文件: 
“+bmpPath);
    return;
   }
 
   try
   {
    //保存word文件到指定的目录下
    myDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref
Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref
Nothing);
   }
   catch
   {
    System.Windows.Forms.MessageBox.Show(“系统找不到指定目录下的文件: 
“+IMAGEWORDPATH+tempFileName+WORDPOSTFIX);
    return;
   }

        }

   //让生成的word文件可见
   myWord.Visible = true;
  }

        #endregion

  /// <summary>
  /// 把数据文件导入到.txt文件
  /// </summary>
  /// <param name=”ds”></param>
  public void ExportToTxt(DataSet ds)
  {

        public Word.Document Document

   if(ds.Tables.Count!=0)
   {
    string tempFileName = null;
    tempFileName = GetTempFileName();

        {

 
    //创建一个.txt文件,文件名用系统时间生成精确到毫秒
    FileInfo file = new FileInfo(TXTPATH+tempFileName+TXTPOSTFIX);
    StreamWriter textFile = null;
    try
    {
     textFile = file.CreateText();
    }
    catch
    {
     System.Windows.Forms.MessageBox.Show(“系统找不到指定目录下的文件: 
“+TXTPATH+tempFileName+TXTPOSTFIX);
     return;
    }

            get

    //把Dataset中的数据写入.txt文件中
    for(int totaltable = 0;totaltable<ds.Tables.Count;totaltable++)
    {
     //统计dataset中当前表的行数
     int row = ds.Tables[totaltable].Rows.Count;

            {

     //统计dataset中当前表的列数
     int column = ds.Tables[totaltable].Columns.Count;

                return this.oDoc;

     //用于统计当前表中每列记录中字符数最长的字符串的长度之和
     int totalLength = 0;

            }

    
//用于统计标题的长度(dataset中的表名的length+”表的数据如下”的length)
     int titleLength = 0;

        }

     //统计每列记录中字符数最长的字符串的长度
     int[] columnLength = new int[column];
     for(int i = 0;i<column;i++)
     {
      columnLength[i] =
ds.Tables[totaltable].Columns[i].ColumnName.ToString().Length;
     }
     for(int i = 0;i<row;i++)
     {
      for(int j = 0;j<column;j++)
      {
      
if(ds.Tables[totaltable].Rows[i][j].ToString().Length>columnLength[j])
       {
       
columnLength[j]=ds.Tables[totaltable].Rows[i][j].ToString().Length;
       }
      }
     }

        public Word.ApplicationClass Application

     //统计当前表中每列记录中字符数最长的字符串的长度之和
     for(int i = 0;i<column;i++)
     {
      totalLength = totalLength+columnLength[i]+DATADISTANCE;
     }
     totalLength = totalLength+2*TABDISTANCE-DATADISTANCE;

        {

    
//统计标题的长度(dataset中的当前表名的length+”表的数据如下”的length)
     titleLength =
ds.Tables[totaltable].TableName.ToString().Length+”表的数据如下”.Length*2;

            get

     //把标题写入.txt文件中
     for(int i = 0;i<(int)((totalLength-titleLength)/2);i++)
     {
      textFile.Write(‘ ‘);
     }
     textFile.Write(ds.Tables[totaltable].TableName+”表的数据如下”);
     textFile.WriteLine();
     for(int i = 0;i<totalLength;i++)
     {
      textFile.Write(‘*’);
     }
     textFile.WriteLine();
     textFile.Write(“t”);

            {

     //把dataset中当前表的字段名写入.txt文件中
     for(int i = 0;i<column;i++)
     {
     
textFile.Write(ds.Tables[totaltable].Columns[i].ColumnName.ToString());
      for(int k =
0;k<columnLength[i]-ds.Tables[totaltable].Columns[i].ColumnName.ToString().Length+DATADISTANCE;k++)
      {
       textFile.Write(‘ ‘);
      }
     }
     textFile.WriteLine();
     for(int i = 0;i<totalLength;i++)
     {
      textFile.Write(‘-‘);
     }
     textFile.WriteLine();
     textFile.Write(“t”);

                return this.oWordApplic;

     //把dataset中当前表的数据写入.txt文件中
     for(int i = 0;i<row;i++)
     {
      for(int j = 0;j<column;j++)
      {
      
textFile.Write(ds.Tables[totaltable].Rows[i][j].ToString());
       for(int k =
0;k<columnLength[j]-ds.Tables[totaltable].Rows[i][j].ToString().Length+DATADISTANCE;k++)
       {
        textFile.Write(‘ ‘);
       }
      }
      textFile.WriteLine();
      textFile.Write(“t”);
     }
     textFile.WriteLine();
     for(int i = 0;i<totalLength;i++)
     {
      textFile.Write(‘-‘);
     }
     textFile.WriteLine();
     textFile.WriteLine();
     textFile.WriteLine();
    }

            }    

    //关闭当前的StreamWriter流
    textFile.Close();
    System.Windows.Forms.MessageBox.Show(“数据文件已保存到”+”  
“+file.FullName);               
   }
   else
   {
    System.Windows.Forms.MessageBox.Show(“No Data”);
   }
  }

        } 

  public string GetTempFileName()
  {
   return DateTime.Now.ToString(“yyyyMMddhhmmssfff”);
  }
 }
}

        私有方法#region 私有方法

        /**//// <summary>

        /// 设置Word文档是否可视

        /// </summary>

        /// <param name=”InEnabled”>boolean</param>

        private void SetVisible( Boolean InEnabled )

        {

            oWordApplic.Visible = InEnabled;

        }

        /**//// <summary>

        /// 在垃圾回收时,在任务管理器中还存在当前操作的WORD的进程

        ///
查阅资料,必须在另一个方法中在调用GC才可以真正的清楚掉,当前的进程

        /// </summary>

        private void GCForQuit()

        {

            object missing = System.Reflection.Missing.Value;

            oWordApplic.Application.Quit( ref missing, ref missing, ref
missing );    

            if ( oDoc != null )

            {

              
 System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc);

                oDoc = null;

            }

            if ( oWordApplic != null )

            {

              
 System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordApplic);

                oWordApplic = null;

            }

            GC.Collect();

        }

        /**//// <summary>

        /// 返回保存文件的FileName

        /// </summary>

        /// <param
name=”strDefaultExt”>要保存文件的类型</param>

        /// <param
name=”strFilter”>文件名筛选器字符串</param>

        /// <returns>保存的路径</returns>

        private string SaveFileName( string strDefaultExt, string
strFilter )

        {

            string fileName = “”;

            System.Windows.Forms.SaveFileDialog saveFileDlg = new
System.Windows.Forms.SaveFileDialog(); 

            saveFileDlg.DefaultExt    = strDefaultExt;

            saveFileDlg.Filter        = strFilter;

            if ( saveFileDlg.ShowDialog() ==
System.Windows.Forms.DialogResult.OK ) 

                fileName = saveFileDlg.FileName;

            return fileName;

        }

        /**//// <summary>

        /// 将被 SaveFileName 取代

        /// </summary>

        /// <returns></returns>

        private string SaveFileToHtmlForName()

        {

            string fileName = “”;

            System.Windows.Forms.SaveFileDialog saveFileDlg = new
System.Windows.Forms.SaveFileDialog(); 

            saveFileDlg.DefaultExt    = “Html”;

            saveFileDlg.Filter        = “html文件 (*.html)|*.htm”;

            if ( saveFileDlg.ShowDialog() ==
System.Windows.Forms.DialogResult.OK ) 

                fileName = saveFileDlg.FileName;

            return fileName;

        }    

        /**//// <summary>

        /// 保存

        /// </summary>

        private void Save( )

        {

            oDoc.Save();            

        }        

        #endregion 

        公有方法#region 公有方法

        /**//// <summary>

        /// 打开一个空的Word模板

        /// </summary>

        public bool Open( )

        {

            bool result = false;

            try

            {

                object missing    = System.Reflection.Missing.Value;

                oDoc            = oWordApplic.Documents.Add( ref
missing, ref missing, ref missing, ref missing );

                oDoc.Activate(); 

                result = true;

            }

            catch

            {

                this.Quit();

                //throw ( new Exception() );

            }

            return result;

        }

        

        /**//// <summary>

        /// 退出

        /// </summary>

        public void Quit( )

        {

            GCForQuit();

            GC.Collect();

            foreach(System.Diagnostics.Process p in
System.Diagnostics.Process.GetProcesses()) 

            {

                if(p.ProcessName.ToUpper() == “WINWORD”)

                {

                    p.Kill();

                }

            }

        }

        /**//// <summary>

        /// 打开指定的Word文档

        /// </summary>

        /// <param name=”strFileName”>指定的Word文档</param>

        public bool Open( string strFileName )

        {

            return this.Open( strFileName, true );

        }    

        /**//// <summary>

        /// 打开指定的Word文档并判断是否显示

        /// </summary>

        /// <param name=”strFileName”>指定的Word文档</param>

        /// <param name=”isEnabled”>显示与否</param>

        public bool Open( string strFileName, bool isEnabled  )

        {

            bool result = false;

            if ( strFileName == null || strFileName == “” ) return
result;

            try

            {

                object fileName        = strFileName;

                object readOnly        = false;

                object isVisible    = true;

                object missing        = System.Reflection.Missing.Value;

            #if OFFICEXP

            oDoc                = oWordApplic.Documents.Open(ref
fileName, ref missing,ref readOnly, 

                                    ref missing, ref missing, ref
missing, ref missing, ref missing, ref missing, 

                                    ref missing, ref missing, ref
isVisible,ref missing,ref missing,ref missing);

            #else

                oDoc                = oWordApplic.Documents.Open(ref
fileName,  ref missing,ref readOnly, 

                    ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, 

                    ref missing, ref missing, ref isVisible);

            #endif

                oDoc.Activate();        

                oWordApplic.Visible = isEnabled;

                result = true;

            }

            catch

            {

                this.Quit();

                //throw ( new Exception() );

            }

            return result;

        }    

        /**//// <summary>

        /// 另存

        /// </summary>

        public bool SaveAs( )

        {

            object missing            = System.Reflection.Missing.Value;

            object fileName            = SaveFileName( “doc”, “doc文件
(*.doc)|*.doc” );

            return this.SaveAs( Convert.ToString( fileName ) );

        }    

        /**//// <summary>

        /// 另存

        /// </summary>

        /// <param name=”strFileName”></param>

        public bool SaveAs( string strFileName )

        {

            bool result = false;

            if ( strFileName == null || strFileName == “” ) return
result;

            try

            {

                object missing    = System.Reflection.Missing.Value;

                object fileName = strFileName ;

            #if OFFICEXP

                oDoc.SaveAs( ref fileName, ref missing,ref missing, ref
missing,ref missing,ref missing,ref missing,

                            ref missing,ref missing,ref missing, ref
missing, ref missing, ref missing, ref missing, ref missing, ref missing
);

            #else

                oDoc.SaveAs( ref fileName, ref missing, ref missing, ref
missing, ref missing, ref missing, ref missing, ref missing, ref
missing, ref missing, ref missing );

            #endif

                result = true;

            }

            catch

            {

                //throw( new Exception() );

            }

            finally

            {

                this.Quit();

            }

            return result;

        }    

        /**//// <summary>

        /// 把Word文档装化为Html文件

        /// </summary>

        /// <param
name=”strFileName”>要转换的Word文档</param>

        public bool WordToHtml( string strFileNameForWord )

        {

            string saveFileName = strFileName +
DateTime.Now.ToString(“yyyy-MM-dd-HH-mm-ss”) + PostfixForHtml;

            return this.WordToHtml( strFileNameForWord, saveFileName );

        }

        /**//// <summary>

        /// 把Word文档装化为Html文件

        /// </summary>

        /// <param
name=”strFileName”>要转换的Word文档</param>

        /// <param
name=”strSaveFileName”>要生成的具体的Html页面</param>

        public bool WordToHtml( string strFileNameForWord, string
strSaveFileName )

        {

            bool result = false;

            if ( strFileNameForWord == null || strFileNameForWord == “”
) return result;

            if ( this.Open( strFileNameForWord, false ) )

            {

                try

                {

                    Type wordType = oWordApplic.GetType();

                    // 打开文件

                    Type docsType = oWordApplic.Documents.GetType();

                    // 转换格式,另存为

                    Type docType = oDoc.GetType();

                    object saveFileName = strSaveFileName;

                    docType.InvokeMember( “SaveAs”,
System.Reflection.BindingFlags.InvokeMethod, null, oDoc, new object[]{
saveFileName, Word.WdSaveFormat.wdFormatHTML } );

                    其它格式:#region 其它格式:

                    /**////wdFormatHTML

                    ///wdFormatDocument

                    ///wdFormatDOSText

                    ///wdFormatDOSTextLineBreaks

                    ///wdFormatEncodedText

                    ///wdFormatRTF

                    ///wdFormatTemplate

                    ///wdFormatText

                    ///wdFormatTextLineBreaks

                    ///wdFormatUnicodeText

                  
 //———————————————————————————–

                    //            docType.InvokeMember( “SaveAs”,
System.Reflection.BindingFlags.InvokeMethod,

                    //                null, oDoc, new
object[]{saveFileName, Word.WdSaveFormat.wdFormatHTML} );

                    // 退出 Word

                    //wordType.InvokeMember( “Quit”,
System.Reflection.BindingFlags.InvokeMethod,

                    //    null, oWordApplic, null );

                    #endregion

                    result = true;

                }

                catch

                {

                    //throw ( new Exception() );

                }

                finally

                {

                    this.Quit();

                }

            }

            return result;

        }

        /**//// <summary>

        /// 插入文本操作,所有的打开与保存操作在外部执行

        /// </summary>

        /// <param name=”strText”></param>

        public void InsertText( string strText )

        {

            oWordApplic.Selection.TypeText( strText );

        }

        public void InsertText( string strText, int iNum )

        {

            for ( int i = 0; i < iNum; i++ )

                this.InsertText( strText );

        }

        /**//// <summary>

        /// 插入文本操作

        /// </summary>

        /// <param name=”strText”>要保存的字符串</param>

        public bool InsertTextBySelection( string strText )

        {

            string strsavefilename = strFileName +
DateTime.Now.ToString(“yyyyMMddHHmmss”) + PostfixForWord;

            return this.InsertTextBySelection( strText, strsavefilename
);

        }

        /**//// <summary>

        /// 

        /// </summary>

        /// <param name=”strText”>要保存的字符串</param>

        /// <param
name=”strSaveFileName”>保存后的doc文件名</param>

        public bool InsertTextBySelection( string strText, string
strSaveFileName )

        {

            return this.InsertTextBySelection( strText, strSaveFileName,
20, 20, 0, 0, “华文仿宋” );

        }

        /**//// <summary>

        /// 

        /// </summary>

        /// <param name=”strText”>要保存的字符串</param>

        /// <param
name=”strSaveFileName”>保存后的doc文件名</param>

        /// <param name=”leftindent”>首行缩近多少</=param>

        /// <param name=”size”>字体大小</param>

        /// <param name=”boldbi”>是否粗体;1 yes, 0
no</param>

        /// <param
name=”paragraphalignment”>对齐方式</param>

        public bool InsertTextBySelection( string strText, string
strSaveFileName, float firstlineindent , int size, int boldbi,int
paragraphalignment, string fontname )

        {

            bool result = false;

            if ( strText == “” || strText == null ) return result;

            if ( this.Open() )

            {

                try

                {

                    string[] strvalue = strText.Split( ‘$’);

                    if ( strvalue.Length != 0  )

                    {

                        oWordApplic.Selection.TypeText( “今天是:”+
DateTime.Now.ToString(“yyyy-MM-dd”) );

                        Word.Paragraph para = this.GoToFirstParagraph();

                        para.Range.Select();

                        this.SetFontName( fontname );

                        this.SetFirstLineIndent( firstlineindent );

                        this.SetFontSize( 20 );

                        this.setBoldBi( boldbi );

                        switch ( paragraphalignment )

                        {

                            case 0 :

                              
 this.SetAlignment(Word.WdParagraphAlignment.wdAlignParagraphLeft);

                                break;

                            case 1 :

                              
 this.SetAlignment(Word.WdParagraphAlignment.wdAlignParagraphCenter);

                                break;

                            case 2:

                              
 this.SetAlignment(Word.WdParagraphAlignment.wdAlignParagraphRight);

                                break;

                        }

                        int j = 0;

                        for( int i= 0; i < strvalue.Length; i++ )

                        {

                            

                          
 this.InsertParagraphAfterByParagraph(para,1);    //加1个空行

                            para = this.GoToEndParagraph();            
    //定位到第1空行

                            this.InsertTextBeforeByParagraph( para,
strvalue[i] );

                            para = this.GoToEndParagraph();

                            para.Range.Select();

                            this.setBoldBi( boldbi );                  
     //设置标题非粗体字

                            this.SetFontSize( size );                  
     //设置字体大小

                            this.SetFontName( fontname );              
     //设置字体

                            j++;

                            if ( j == 9 )

                            {

                                this.InsertText( “━━━━”, 6 );

                                j = 0;

                            }

                        }

                        if ( this.SaveAs( strSaveFileName ) )

                            result = true;

                    }

                }

                catch

                {

                    this.Quit();

                    //throw( new Exception() );

                }

            }

            return result;

        }

        /**//// <summary>

        /// 插入空行

        /// </summary>

        public void InsertLineBreakBySelection( )

        {

            oWordApplic.Selection.TypeParagraph();

        }

        /**//// <summary>

        /// 插入指定的空行

        /// </summary>

        /// <param name=”nline”>行数</param>

        public void InsertLineBreakBySelection( int nline )

        {

            for ( int i = 0; i < nline; i++ )

                this.InsertLineBreakBySelection();

        }

        /**//// <summary>

        /// 换页

        /// </summary>

        public void InsertPagebreak()

        {

            object pBreak= (int)Word.WdBreakType.wdPageBreak;

            oWordApplic.Selection.InsertBreak( ref pBreak );

        }

        public void InsertTextBeforeByParagraph( Word.Paragraph
paragraph, string strText )

        {

            paragraph.Range.InsertBefore( strText );

        }

        public void InsertTextAfterByParagraph( Word.Paragraph
paragraph, string strText )

        {

            paragraph.Range.InsertAfter( strText );

        }

        public void InsertParagraphBeforeByParagraph( Word.Paragraph
paragraph )

        {

            paragraph.Range.InsertParagraphBefore();

        }

        public void InsertParagraphBeforeByParagraph( Word.Paragraph
paragraph,int nLine )

        {

            for ( int i = 0; i < nLine; i++ )

                paragraph.Range.InsertParagraphBefore();

        }

        public void InsertParagraphAfterByParagraph( Word.Paragraph
paragraph )

        {

            paragraph.Range.InsertParagraphAfter();

        }

        public void InsertParagraphAfterByParagraph( Word.Paragraph
paragraph, int nLine )

        {

            for ( int i = 0; i < nLine; i++ )

                paragraph.Range.InsertParagraphAfter();

        }

        /**//// <summary>

        /// 数据集转换 即把DataSet转换为Word对象 

        /// </summary>

        /// <param name=”ds”></param>

        public bool DataSetToWord( DataSet ds, string strFileName )

        {

            bool result = false;

            if ( ds == null ) return result;

            if ( strFileName == null || strFileName == “” ) return
result;

            if ( this.Open() )

            {

                try

                {

                    Word.Range para =
oWordApplic.Application.Selection.Paragraphs.Item(1).Range;

                    object tableBehavior  
 =System.Reflection.Missing.Value;

                    object autoFitBehavior  
 =System.Reflection.Missing.Value;

                    oDoc.Tables.Add( para,

                        ds.Tables[0].Rows.Count+1,  
 //多的一行用来表示表列

                        ds.Tables[0].Columns.Count,

                        ref tableBehavior,

                        ref autoFitBehavior );

                    //填充Word表格的列标

                    for( int intCol = 0; intCol <
ds.Tables[0].Columns.Count; intCol++ )

                    {

                        oDoc.Tables.Item(1).Cell( 1, intCol+1
).Range.InsertBefore( ds.Tables[0].Columns[intCol].ColumnName.Trim()
);

                    }

                

                    //填充Word表格的内容

                    for( int intRow = 0; intRow <
ds.Tables[0].Rows.Count; intRow++ )

                    {

                        for( int intCol = 0; intCol <
ds.Tables[0].Columns.Count; intCol++ )

                        {

                            oDoc.Tables.Item(1).Cell( intRow+2, intCol+1
).Range.InsertBefore(
ds.Tables[0].Rows[intRow][intCol].ToString().Trim() );

                        }

                    }

                    //保存

                    if ( this.SaveAs( strFileName ) )

                        result = true;

                }

                catch

                {

                    this.Quit();

                    //throw ( new Exception() );

                }

            }

            return result;

        }

        

        /**//// <summary>

        /// 采用默认地址保存

        /// </summary>

        /// <param name=”ds”></param>

        public bool DataSetToWord( DataSet ds )

        {

            return this.DataSetToWord( ds, strFileName +
ds.Tables[0].TableName.ToString() + PostfixForWord );

        }

        /**//// <summary>

        /// 段落的对齐方式

        ///
例如:word.SetAlignment(Word.WdParagraphAlignment.wdAlignParagraphCenter)

        /// </summary>

        /// <param name=”alignment”></param>

        public void SetAlignment( Word.WdParagraphAlignment alignment )

        {

            oWordApplic.Selection.ParagraphFormat.Alignment = alignment;

        }

        /**//// <summary>

        /// 首行缩进

        /// </summary>

        /// <param name=”fltCount”>float类型的数值</param>

        public void SetFirstLineIndent( float fltCount )

        {

            oWordApplic.Selection.ParagraphFormat.FirstLineIndent =
fltCount;

        }

        /**//// <summary>

        /// 左缩进

        /// </summary>

        /// <param name=”fltCount”>float类型的数值</param>

        public void SetLeftIndent( float fltCount )

        {

            oWordApplic.Selection.ParagraphFormat.LeftIndent = fltCount;

        }

        /**//// <summary>

        /// 右缩进

        /// </summary>

        /// <param name=”fltCount”>float类型的数值</param>

        public void SetRightIndent(float fltCount)

        {

            oWordApplic.Selection.ParagraphFormat.RightIndent =
fltCount;

        }

        /**//// <summary>

        /// 设置字体类型

        /// </summary>

        /// <param name=”strType”></param>

        public void SetFont( string strType )

        {

            switch (strType)

            {

                case “Bold”:

                    oWordApplic.Selection.Font.Bold = 1;

                    break;

                case “Italic”:

                    oWordApplic.Selection.Font.Italic = 1;

                    break;

                case “Underlined”:

                    oWordApplic.Selection.Font.Subscript = 0;

                    break;

            }

            

        }

        

        /**//// <summary>

        /// 设置默认字体

        /// </summary>

        public void SetFont( )

        {

            oWordApplic.Selection.Font.Bold            = 0;

            oWordApplic.Selection.Font.Italic        = 0;

            oWordApplic.Selection.Font.Subscript    = 0;

        

        }

        /**//// <summary>

        /// 设置字体名称

        /// </summary>

        /// <param name=”strType”></param>

        public void SetFontName( string strType )

        {

            oWordApplic.Selection.Font.Name = strType;

            

        } 

        /**//// <summary>

        /// 设置字体颜色

        /// </summary>

        /// <param name=”Color”></param>

        public void SetFontColor( Word.WdColor Color)

        {

            oWordApplic.Selection.Font.Color = Color;

        }

        /**//// <summary>

        /// 设置字体大小

        /// </summary>

        /// <param name=”nSize”></param>

        public void SetFontSize( int nSize )

        {

            oWordApplic.Selection.Font.Size = nSize;

            

        } 

        /**//// <summary>

        /// 设置是否有粗体,0->否 ,1->是

        /// </summary>

        /// <param name=”intBoldBi”></param>

        public void setBoldBi( int intBoldBi )

        {

            oWordApplic.Selection.Font.BoldBi = intBoldBi;

            //oWordApplic.Selection.Font.Bold = intBoldBi;

        }

        public void SetBoldSize( int intBold )

        {

            oWordApplic.Selection.Font.Bold = intBold;

        }

        public void SetUnderLine( Word.WdUnderline underLine )

        {

            oWordApplic.Selection.Font.Underline = underLine; 

        }

        public void SetUnderLineColor( Word.WdColor Color )

        {

            oWordApplic.Selection.Font.UnderlineColor = Color;

        }

        /**//// <summary>

        /// 定位到书签

        /// </summary>

        /// <param name=”strBookMarkName”></param>

        public void GotoBookMark( string strBookMarkName )

        {

            object missing        = System.Reflection.Missing.Value;

            object Bookmark        =
(int)Word.WdGoToItem.wdGoToBookmark;

            object NameBookMark = strBookMarkName;

            oWordApplic.Selection.GoTo( ref Bookmark, ref missing, ref
missing,ref NameBookMark );

        }

        /**//// <summary>

        /// 定位到文档开头

        /// </summary>

        public void GoToTheBeginning( )

        {

            object missing    = System.Reflection.Missing.Value;

            object unit;

            unit            = Word.WdUnits.wdStory ;

            oWordApplic.Selection.HomeKey ( ref unit, ref missing );

            

        } 

        /**//// <summary>

        /// 定位到文档结尾

        /// </summary>

        public void GoToTheEnd( )

        {

            object missing    = System.Reflection.Missing.Value;

            object unit;

            unit            = Word.WdUnits.wdStory ;

            oWordApplic.Selection.EndKey ( ref unit, ref missing );

        } 

        /**//// <summary>

        /// 定位到首段

        /// </summary>

        /// <returns></returns>

        public Word.Paragraph  GoToFirstParagraph()

        {

            return this.oWordApplic.Selection.Paragraphs.First;

        }

        /**//// <summary>

        /// 定位到尾段

        /// </summary>

        /// <returns></returns>

        public Word.Paragraph GoToEndParagraph()

        {

            return this.oWordApplic.Selection.Paragraphs.Last ;

        }

        /**//// <summary>

        /// 向后定位到指定段落

        /// </summary>

        /// <param name=”para”></param>

        /// <param name=”count”></param>

        public void GoToNextParagraph(ref Word.Paragraph para,ref object
count)

        {

            para.Next(ref count) ;

        }

        /**//// <summary>

        /// 向前定位到指定段落

        /// </summary>

        /// <param name=”para”></param>

        /// <param name=”count”></param>

        public void GoToPreviousParagraph( ref Word.Paragraph para, ref
object count )

        {

            para.Previous( ref count ) ;

        }

        public void GoToTheTable( int ntable )

        {

            object missing    = System.Reflection.Missing.Value;

            object what;

            what            = Word.WdUnits.wdTable ;

            object which;

            which            = Word.WdGoToDirection.wdGoToFirst;

            object count;

            count            = 1 ;

            oWordApplic.Selection.GoTo( ref what, ref which, ref count,
ref missing );

        } 

        public void GoToRightCell( )

        {

            object missing    = System.Reflection.Missing.Value;

            object direction;

            direction        = Word.WdUnits.wdCell;

            oWordApplic.Selection.MoveRight( ref direction, ref missing,
ref missing );

        } 

        public void GoToLeftCell( )

        {

            object missing    = System.Reflection.Missing.Value;

            object direction;

            direction        = Word.WdUnits.wdCell;

            oWordApplic.Selection.MoveLeft( ref direction, ref missing,
ref missing );

        } 

        public void GoToDownCell( )

        {

            object missing = System.Reflection.Missing.Value;

            object direction;

            direction = Word.WdUnits.wdLine;

            oWordApplic.Selection.MoveDown( ref direction, ref missing,
ref missing );

        } 

        public void GoToUpCell( )

        {

            object missing    = System.Reflection.Missing.Value;

            object direction;

            direction        = Word.WdUnits.wdLine;

            oWordApplic.Selection.MoveUp( ref direction, ref missing,
ref missing );

        } 

        public Boolean ExecuteReplace( Word.Find find )

        {

            return ExecuteReplace( find, Word.WdReplace.wdReplaceAll );

        }

        public Boolean ExecuteReplace( Word.Find find, Object
replaceOption )

        {

            // Simple wrapper around Find.Execute:

            Object findText = Type.Missing;

            Object matchCase = Type.Missing;

            Object matchWholeWord = Type.Missing;

            Object matchWildcards = Type.Missing;

            Object matchSoundsLike = Type.Missing;

            Object matchAllWordForms = Type.Missing;

            Object forward = Type.Missing;

            Object wrap = Type.Missing;

            Object format = Type.Missing;

            Object replaceWith = Type.Missing;

            Object replace = replaceOption;

            Object matchKashida = Type.Missing;

            Object matchDiacritics = Type.Missing;

            Object matchAlefHamza = Type.Missing;

            Object matchControl = Type.Missing;

      

            return find.Execute( ref findText, ref matchCase, ref
matchWholeWord, 

                ref matchWildcards, ref matchSoundsLike, ref
matchAllWordForms, 

                ref forward, ref wrap, ref format,    ref replaceWith,
ref replace, 

                ref matchKashida, ref matchDiacritics, ref
matchAlefHamza, 

                ref matchControl );

        }

    

        public Boolean ExecuteFind( Word.Find find )

        {

            return ExecuteFind( find, find.Text, Type.Missing,
Type.Missing );

        }

        public Boolean ExecuteFind( Word.Find find, string strFindText )

        {

            return ExecuteFind( find, strFindText, Type.Missing,
Type.Missing );

        }

        public Boolean ExecuteFind(

            Word.Find find, string strFindText, Object wrapFind, Object
forwardFind )

        {

            // Simple wrapper around Find.Execute:

            

            Object findText ;

            Object matchCase = Type.Missing;

            Object matchWholeWord = Type.Missing;

            Object matchWildcards = Type.Missing;

            Object matchSoundsLike = Type.Missing;

            Object matchAllWordForms = Type.Missing;

            Object forward = forwardFind;

            Object wrap = wrapFind;

            Object format = Type.Missing;

            Object replaceWith = Type.Missing;

            Object replace = Type.Missing;

            Object matchKashida = Type.Missing;

            Object matchDiacritics = Type.Missing;

            Object matchAlefHamza = Type.Missing;

            Object matchControl = Type.Missing;

      

            if ( ( strFindText == “” )||( strFindText == string.Empty )
)

                findText = find.Text;

            else

                findText = strFindText;

            find.ClearFormatting();

            return find.Execute( ref findText, ref matchCase, ref
matchWholeWord, 

                ref matchWildcards, ref matchSoundsLike, ref
matchAllWordForms, 

                ref forward, ref wrap, ref format, ref replaceWith, ref
replace, 

                ref matchKashida, ref matchDiacritics, ref
matchAlefHamza, 

                ref matchControl );

        }

        

    

        public Boolean FindInSelection( Word.Selection Selection, string
strFindText ) 

        {

                        

            return this.ExecuteFind(
Selection.Find,strFindText,System.Type.Missing,System.Type.Missing );

        }

        public Boolean FindInSelection( Word.Selection Selection, string
strFindText, Object wrapFind, Object forwardFind ) 

        {

                        

            return this.ExecuteFind( Selection.Find, strFindText,
wrapFind, forwardFind );

        }

        public Boolean FindInRange( Word.Range range,string strFindText

        {

            Boolean blnReturn  =this.ExecuteFind( range.Find,
strFindText, Type.Missing, Type.Missing );

            range.Select();

            return blnReturn;

        }

  

        public void FindInAllDocument( string strFindText ) 

        {

            int intFound        = 0;

            Object start        = 0;

            Object end            = this.oDoc.Characters.Count;

            Word.Range rngDoc    = oDoc.Range( ref start, ref end );

            Word.Find fnd        = rngDoc.Find;

            fnd.ClearFormatting();

            fnd.Forward        = true;

            fnd.Text        = strFindText;

            ExecuteFind( fnd );

            while ( fnd.Found )

            {

                rngDoc.Font.Color    = Word.WdColor.wdColorRed;

                rngDoc.Font.Bold    = 600;

                intFound++;

                ExecuteFind( fnd );

            }

            MessageBox.Show( String.Format( “lorem found {0} times.”,
intFound ), “FindInLoopAndFormat” );

        }

        #endregion

    }

}