当前位置:编程学习 > C#/ASP.NET >>

C# 开机启动读取配置文件问题,跪求指教

我的程序中使用到了backgroundWorker控件,当窗体加载的时候就使用这控件进行读取XML文件,防止假死,而且我需要开机启动此程序,现在的问题是,我开机时,的确启动了本程序,但是,却读取不了xml配置文件,我使用了System.Threading.Thread.Sleep(10000),这样也不行,但是开机后,用手动启动是完全正常的,这是怎么回事啊?开机启动类如下

#region 开机启动类
        class Register
        {

            /// <summary>
            /// 开机启动注册表检查
            /// </summary>
            public void start_with_windows()
            {
                RegistryKey hklm = Registry.LocalMachine;
                RegistryKey run = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
                //未设置开机启动
                if (run.GetValue("CheckWorkAttendance") == null)
                {
                    register();
                }

            }

            /// <summary>
            /// 将程序的开机启动写入注册表
            /// </summary>
            private void register()
            {
                string starupPath = Application.ExecutablePath;
                //class Micosoft.Win32.RegistryKey. 表示Window注册表中项级节点,此类是注册表装.
                RegistryKey loca = Registry.LocalMachine;
                RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

                try
                {
                    run.SetValue("CheckWorkAttendance", starupPath);
                    //MessageBox.Show("注册表添加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    loca.Close();
                    run.Close();
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }


        }
        #endregion

处理代码:

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)//异步执行代码
        {
            #region 异步执行代码
            BackgroundWorker worker = (BackgroundWorker)sender;//获取异步对象
            try
            {
                //读取机器连接数据
                XmlDataDocument xm = new XmlDataDocument();
                xm.Load("Service.xml");
                //读属性
                XmlNodeList xs = xm.GetElementsByTagName("Equipment");//获取XML中的根节点
                XmlNodeList xs1 = xm.GetElementsByTagName("connectionString");//读取XML中的连接字符串
                XmlNode node = xs1.Item(0);
                MethodOperation.connectionString = node.ChildNodes[0].Attributes["value"].Value;//根据value获取对应的值
                int jiqiCount = xs.Count;
                value = 100 / jiqiCount;//分配进度条宽度
                for (int i = 0; i < jiqiCount; i++)//循环个数
                {
                    AttendanceMachineModle attinfo = new AttendanceMachineModle();//创建终端对象
                    foreach (XmlNode a in xs.Item(i))
                    {
                        if (a.Name == "Number")
                        {
                            attinfo.DwMachineNumber = int.Parse(a.InnerText);
                        }
                        if (a.Name == "IP")
                        {
                            attinfo.Ip = a.InnerText;
                        }
                        if (a.Name == "Port")
                        {
                            attinfo.Port = int.Parse(a.InnerText);
                        }

                    }
                    zkemkeeper.CZKEMClass Cinfo = new zkemkeeper.CZKEMClass();//创建机器对象

                    if (!worker.CancellationPending) { worker.ReportProgress(i + 1, null); }

                    attinfo.IsConnect = Cinfo.Connect_Net(attinfo.Ip, attinfo.Port);//对遍历的终端进行连接操作
                    if (!worker.CancellationPending) { worker.ReportProgress(i + 1, attinfo.IsConnect.ToString()); }//调用异步通知
                    MethodOperation.lCZKEMClass.Add(Cinfo);//将机器对象加入至机器对象集合
                    MethodOperation.lAttendanceMachine.Add(attinfo);//将机器终端加入至终端集合

                }
                XmlNodeList xmllist = xm.GetElementsByTagName("Time");//获取程序定时更新考勤数据时间根节点
                XmlNode xml = xmllist.Item(0);

                int h = 0;
                int m = 1;
                foreach (XmlNode item in xml.ChildNodes)
                {
                    if (item.Name == "Hour")
                    {
                        h = int.Parse(item.InnerText);
                    }
                    else if (item.Name == "Minute")
                    {
                        m = int.Parse(item.InnerText);
                    }
                }
                string time = "1999-01-01 " + h + ":" + m + ":00";
                MethodOperation.Time = DateTime.Parse(time);//读取完后并进行保存
                MethodOperation.Synchronization();//数据都读取完成后,调用更新数据函数,此函数将机器中的数据读取出来和数据库中的数据进行对比,没有的且日期大的考勤数据进行保存
            }
            catch (Exception ex)
            {
                e.Result = ex;
            } 
            #endregion
            
        }
--------------------编程问答-------------------- 我觉得你还是加个日志,把每一步记录下来,看看为什么没读xml,运行到了那一步,这样方便查找问题 --------------------编程问答-------------------- 我也遇到过这样的问题 ,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。 --------------------编程问答-------------------- 路径问题,一般用快捷方式即可解决,不要直接访问远程序,因为快捷方式本身带有起始位置的设置,那个默认就是应用程序当前目录,除非你吃饱了没事去乱改。 --------------------编程问答--------------------
引用 2 楼 knna_ 的回复:
我也遇到过这样的问题 ,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。

试了。 没用呀,而且手动填写死了,绝对路径不行呀 --------------------编程问答--------------------
引用 3 楼 qldsrx 的回复:
路径问题,一般用快捷方式即可解决,不要直接访问远程序,因为快捷方式本身带有起始位置的设置,那个默认就是应用程序当前目录,除非你吃饱了没事去乱改。

我在桌面创建了快捷方式, 然后怎么将此快捷方式加入到开机启动项?右键属性那路径就是该程序,还是一样的 --------------------编程问答--------------------
引用 4 楼 caowei380 的回复:
引用 2 楼 knna_ 的回复:
我也遇到过这样的问题 ,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。

试了。 没用呀,而且手动填写死了,绝对路径不行呀
比如你的配置文件是在D盘的config文件夹下。路径就写  D:\\config\\test.config  这样都不能读取?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,