C# V3.5 OpenNETCF实现PC与CE设备的文件拷贝

来源:互联网 发布:淘宝cpu散片 编辑:程序博客网 时间:2024/05/21 07:09
 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenNETCF.Desktop.Communication;
using System.Runtime.InteropServices;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace PAMS2CEUpdateToolCS
{
    public partial class PAMS2CEUpdateTool : Form
    {
        private RAPI myrapi = new RAPI();
        private Thread threadActiveSync = null;
        private Thread threadConnectDev = null;
        private Thread threadCopyFile = null;
        private Boolean IsConnected = false;
        private Boolean IsCopyingFile = false;
        private string SrcFileName = "";
        private string DestFileName = "";
        private Socket m_Socket = null;


        private delegate void CheckConnectDelegate();
        private CheckConnectDelegate DelegateConnect = null;

        private delegate void EnableControlDelegate();
        private EnableControlDelegate DelegateEnableControl = null;
        private EnableControlDelegate DelegateDisableControl = null;


        private const string DirPathBase        = "\\Flash\\PAMS2CE\\Base";     //存放原始的base软件,该目录为只读属性
        private const string DirPathUpdate      = "\\Flash\\PAMS2CE\\Update";   //存放用于更新的软件

        private const string FilePathSoftWare   = "\\Flash\\PAMS2CE\\Update\\PAMS2CE.exe";//更新的应用程序
        private const string FilePathCFGdb      = "\\Flash\\PAMS2CE\\Update\\cfg.db";//用于更新的路线数据库
        private const string FilePathDATdb      = "\\Flash\\PAMS2CE\\Update\\dat.db";//用于更新的测试数据的数据库
        private const string FilePathSysFile    = "\\Storage Card\\NK.bin";          //用于更新的系统kernel
        private const string FilePathLog        = "\\Storage Card\\log.txt";         //应用运行的log信息


        const int SW_HIDE = 0;
        const int SW_SHOWNORMAL = 1;
        const int SW_SHOWMINIMIZED = 2;
        const int SW_SHOWMAXIMIZED = 3;

        [DllImport("User32.dll")]
        public static extern bool ShowWindow(IntPtr HWND, int MSG);
        [DllImport("User32.dll")]
        public static extern IntPtr FindWindow(string ClassN, string WindN);

 

        public PAMS2CEUpdateTool()
        {
            InitializeComponent();
        }


        private void PAMS2CEUpdateTool_Load(object sender, EventArgs e)
        {
            DelegateEnableControl = new EnableControlDelegate(EnableControl);
            DelegateDisableControl = new EnableControlDelegate(DisableControl);
            DelegateConnect = new CheckConnectDelegate(ShowConnectStatus);

            myrapi.RAPIConnected += new RAPIConnectedHandler(myrapiConnected);
            myrapi.RAPIDisconnected += new RAPIConnectedHandler(myrapiDisconnected);
            myrapi.Connect(false, -1);


            threadConnectDev = new Thread(this.ThreadConnectToDevice);
            threadConnectDev.Start();

            threadActiveSync = new Thread(this.ThreadHideActiveSyncForm);
            threadActiveSync.Start();

            DisableControl();
        }

 

        //RAPI 相关代码
        #region
        private void myrapiConnected()
        {
            PanelStatus.BackColor = Color.Green;
            IsConnected = true;
            InitDevDirectory();
            this.Invoke(DelegateEnableControl);
        }

        private void myrapiDisconnected()
        {
            PanelStatus.BackColor = Color.Red;
            IsConnected = false;
            myrapi.Connect(false,-1);
            this.Invoke(DelegateDisableControl);
        }


        private void ShowConnectStatus()
        {
            if (!IsConnected)
            {
                OutputText("正在与设备建立连接...", false);
            }
        }


        private void EnableControl()
        {
            tabControlUpdate.Enabled = true;
            OutputText("已与设备建立连接!", false);
        }

        private void DisableControl()
        {
            tabControlUpdate.Enabled = false ;
            OutputText("已与设备断开连接!", false);
        }

        //线程显示连接状态
        private void ThreadConnectToDevice()
        {
            while (true)
            {
                Thread.Sleep(1000);
                while (!IsConnected)
                {
                    Thread.Sleep(1000);
                    this.Invoke(DelegateConnect);
                }
            }
        }

        //线程隐藏ActiveSync的窗体界面
        private void ThreadHideActiveSyncForm()
        {
            while (true)
            {
                ShowWindow(FindWindow(null, "Microsoft ActiveSync"), SW_HIDE);//隐藏
            }
        }

        //线程用于Copy文件
        private void ThreadCopyFile()
        {
            try
            {
                myrapi.CopyFileToDevice(SrcFileName, DestFileName);
                IsCopyingFile = false;

            }
            catch (Exception ex)
            {
                MessageBox.Show("复制文件失败:" + FilePathSysFile+ex.Message,"失败提示");
            }
        }

 


        //初始化/Flash/Base  与 /Flash/Update目录
        private void InitDevDirectory()
        {
            try
            {
                if (IsConnected)
                {
                    if (false == myrapi.DeviceFileExists(DirPathUpdate))
                    {
                        myrapi.CreateDeviceDirectory(DirPathUpdate);
                    }

                    if (false == myrapi.DeviceFileExists(DirPathBase))
                    {
                        myrapi.CreateDeviceDirectory(DirPathBase);
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("目录初始化失败:" + ex.Message, "目录初始化错误");
            }
        }
        #endregion

 

        //Button处理相关代码
        #region
        //文件浏览
        private void btn_FileDir_Click(object sender, EventArgs e)
        {
            if (DialogResult.OK == openFileDialog1.ShowDialog())
            {
                TextBox_FileDir.Text = openFileDialog1.FileName;
                SrcFileName = TextBox_FileDir.Text;
                OutputText("选择的文件为:"+TextBox_FileDir.Text,false);
            }
           
        }

        //检查文件名是否正确
        private Boolean CheckFileName(int index)
        {
            string softWareName = TextBox_FileDir.Text;
            string [] names = softWareName.Split('.');
            string suffix = names[names.Length-1];
            /*Step 1:判断所选文件是否为空*/
            if (softWareName == "")
            {
                OutputText("未选择文件进行升级!", false);
                return false;
            }


            /*Step 2:判断所选类型是否与升级文件一致*/
            if (1 == index)//升级软件
            {
                if (suffix != "exe")
                {
                    OutputText("所选类型与升级文件不符!", false);
                    return false;
                }
            }

            else if (2 == index)//更新系统
            {
                if (suffix != "bin")
                {
                    OutputText("所选类型与升级文件不符!", false);
                    return false;
                }
            }
            else if (3 == index)//更新cfg数据
            {
                if (suffix != "db")
                {
                    OutputText("所选类型与升级文件不符!", false);
                    return false;
                }
            }
            else if (4 == index)//更新dat数据
            {
                if (suffix != "db")
                {
                    OutputText("所选类型与升级文件不符!", false);
                    return false;
                }
            }
            //OutputText("开始复制文件!", false);
            return true;
        }

        //启动线程copy文件
        private void CopyFileFromPCToDevice()
        {
            try
            {
                if (true == myrapi.DeviceFileExists(DestFileName))
                {
                    myrapi.DeleteDeviceFile(DestFileName);
                }

                threadCopyFile = new Thread(ThreadCopyFile);
                IsCopyingFile = true;
                threadCopyFile.Start();
                timerCopyFile.Enabled = true;
                OutputText("开始复制文件", false);
            }
            catch (Exception ex)
            {
                OutputText("删除旧文件失败:" + ex.Message, false);
            }
        }

        #region 软件更新
        //更新软件
        private void BTN_UpdateSoftware_Click(object sender, EventArgs e)
        {
            if (false == CheckFileName(1))
                return;

            DestFileName = FilePathSoftWare;
            CopyFileFromPCToDevice();
        }

        //更细系统
        private void BTN_UpdateSys_Click(object sender, EventArgs e)
        {
            if (false == CheckFileName(2))
                return;

            DestFileName = FilePathSysFile;
            CopyFileFromPCToDevice();
        }
        #endregion

        #region 上传下载
        //更新CFG数据库
        private void BTN_UpdateCFG_Click(object sender, EventArgs e)
        {
            if (false == CheckFileName(3))
                return;

            DestFileName = FilePathCFGdb;
            CopyFileFromPCToDevice();
        }

        //更新Dat数据库
        private void BTN_UpdateDAT_Click(object sender, EventArgs e)
        {
            if (false == CheckFileName(4))
                return;

            DestFileName = FilePathDATdb;
            CopyFileFromPCToDevice();
        }
        #endregion


        #region 其他功能
        //同步时间
        private void BTN_SyncTime_Click(object sender, EventArgs e)
        {
            //string hostName = Dns.GetHostName();
            //string houtIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10000);
            m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            m_Socket.Bind(iep);
        }


        //设备log
        private void BTN_DeviceLog_Click(object sender, EventArgs e)
        {
            try
            {
                if (myrapi.DeviceFileExists(FilePathLog))
                {
                    myrapi.CopyFileFromDevice("./log.txt", FilePathLog, true);
                    OutputText("log.txt获取成功,已放至该程序所在的目录!",false);
                }
                else
                {
                    OutputText("设备暂无log信息!", false);
                }
            }
            catch (Exception ex)
            {
                OutputText("获取log文件失败" + ex.Message, false);
            }
        }


        //系统信息
        private void BTN_SysInfo_Click(object sender, EventArgs e)
        {
            try
            {
                MEMORYSTATUS ms = new MEMORYSTATUS();
                myrapi.GetDeviceMemoryStatus(out ms);

                STORE_INFORMATION StoreInfo = new STORE_INFORMATION();
                myrapi.GetDeviceStoreInformation(out StoreInfo);

                SYSTEM_INFO pSI = new SYSTEM_INFO();
                myrapi.GetDeviceSystemInfo(out pSI);

                OSVERSIONINFO VersionInfo = new OSVERSIONINFO();
                myrapi.GetDeviceVersion(out VersionInfo);

                OutputText("可用程序内存:" + ms.dwAvailPhys / 1024 + "k", false);
                OutputText("总共程序内存:" + ms.dwTotalPhys / 1024 + "k", false);
                OutputText("可用存储内存:" + StoreInfo.dwFreeSize / 1024 + "k", false);
                OutputText("总共存储内存:" + StoreInfo.dwStoreSize / 1024 + "k", false);
                OutputText("处理器类型:" + pSI.dwProcessorType, false);
                OutputText("平台类型:" + VersionInfo.dwPlatformId, false);
            }
            catch (Exception ex)
            {
                OutputText("获取设备信息出错:"+ex.Message,false);
            }
        }

        //版本信息
        private void BTN_VersionInfo_Click(object sender, EventArgs e)
        {
            OutputText("软件版本号:*******",false);
            OutputText("硬件版本号:*******", false);
            OutputText("设备识别码:*******", false);
        }

        //清除屏幕
        private void BTN_ClearScreen_Click(object sender, EventArgs e)
        {
            OutputText("开始:", true);
        }

        //退出系统
        private void BTN_Exit_Click(object sender, EventArgs e)
        {
            myrapi.Disconnect();
            myrapi.Dispose();
            if (threadActiveSync != null)
            {
                threadActiveSync.Abort();
                threadActiveSync = null;
            }
            if (threadConnectDev != null)
            {
                threadConnectDev.Abort();
                threadConnectDev = null;
            }
            if (threadCopyFile != null)
            {
                threadCopyFile.Abort();
                threadCopyFile = null;
            }
            this.Close();
        }

        #endregion


        /*在文本框中输入信息*/
        private void OutputText(string content, Boolean isClearScreen)
        {
            if (isClearScreen)
            {
                TextBox_Output.Text = "";
                TextBox_Output.Text = content;
            }
            else
            {
                TextBox_Output.Text += "\r\n";
                TextBox_Output.Text += content;
            }

            TextBox_Output.Focus();
            TextBox_Output.Select(TextBox_Output.TextLength,0);
            TextBox_Output.ScrollToCaret();
        }
        #endregion

 

        //显示文件拷贝的过程信息
        private void timerCopyFile_Tick(object sender, EventArgs e)
        {
            if (IsCopyingFile)
            {
                TextBox_Output.Text += "*";
            }
            else
            {
                timerCopyFile.Enabled = false;
                if (null != threadCopyFile)
                {
                    threadCopyFile.Abort();
                    threadCopyFile = null;
                }
                try
                {
                    long size = myrapi.GetDeviceFileSize(DestFileName);
                    size /= 1024;
                    OutputText("文件复制成功,大小:"+size.ToString()+"k",false);
                }
                catch(Exception ex)
                {
                    OutputText("得到文件大小失败:"+ex.Message,false);
                }
            }
        }

 

       


    }
}

原创粉丝点击