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
处理代码:
--------------------编程问答-------------------- 我觉得你还是加个日志,把每一步记录下来,看看为什么没读xml,运行到了那一步,这样方便查找问题 --------------------编程问答-------------------- 我也遇到过这样的问题 ,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。 --------------------编程问答-------------------- 路径问题,一般用快捷方式即可解决,不要直接访问远程序,因为快捷方式本身带有起始位置的设置,那个默认就是应用程序当前目录,除非你吃饱了没事去乱改。 --------------------编程问答--------------------
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
}
试了。 没用呀,而且手动填写死了,绝对路径不行呀 --------------------编程问答--------------------
我在桌面创建了快捷方式, 然后怎么将此快捷方式加入到开机启动项?右键属性那路径就是该程序,还是一样的 --------------------编程问答-------------------- 比如你的配置文件是在D盘的config文件夹下。路径就写 D:\\config\\test.config 这样都不能读取?
补充:.NET技术 , C#