首页上一页 1 下一页尾页 6 条记录 1/1页
在线升级模块问题 《C#开发典型模块大全(修订版)》
发表在C#图书答疑
2010-10-19
是否精华
是
否
版块置顶:
是
否
设置时间:
非永久
永久
起始时间:
结束时间:
是否扣分:
是
否
我的平台是vs2010。
在运行客户端程序是报错,System.IO.IOException: 文件“D:\mmm\NewXml\Update.xml”正由另一进程使用,因此该进程无法访问此文件。
好像是xml文件读取完,没有释放造成的,对应代码是operateclass中的SelectXML方法,请老师给解答一下,急求答案。
还有一个问题是System.FormatException: 输入字符串的格式不正确。
就是从ini文件中读取出来的intHour,intMin从字符串转为int型的过程中总报错,请老师帮帮忙!
在运行客户端程序是报错,System.IO.IOException: 文件“D:\mmm\NewXml\Update.xml”正由另一进程使用,因此该进程无法访问此文件。
好像是xml文件读取完,没有释放造成的,对应代码是operateclass中的SelectXML方法,请老师给解答一下,急求答案。
还有一个问题是System.FormatException: 输入字符串的格式不正确。
就是从ini文件中读取出来的intHour,intMin从字符串转为int型的过程中总报错,请老师帮帮忙!
精彩评论 6
2010-10-20
板凳
就是XML文件在读取是调用了operateclass类中的以下这个方法。
public Hashtable SelectXML(string strPath)
{
Hashtable HTable = new Hashtable();
XmlDocument doc = new XmlDocument();
doc.Load(strPath);
//获取NewDataSet节点的所有子节点
XmlNodeList xnl = doc.SelectSingleNode("UpdCfg").ChildNodes;
string strVersion = "";
string strInfo = "";
foreach (XmlNode xn in xnl)//遍历UpdCfg节点下的所有子节点
{
XmlElement xe = (XmlElement)xn; //将子节点类型转换为XmlElement类型
if (xe.Name == "Upgrade") //判断节点名为Upgrade
{
XmlNodeList xnlChild = xe.ChildNodes; //继续获取xe子节点的所有子节点
foreach (XmlNode xnChild in xnlChild) //遍历Upgrade节点下的所有子节点
{
XmlElement xeChild = (XmlElement)xnChild; //转换类型
if (xeChild.Name == "Version")
{
strVersion = xeChild.InnerText;
}
if (xeChild.Name == "UpdInfo")
{
strInfo = xeChild.InnerText;
}
}
HTable.Add(strVersion, strInfo);
}
}
doc.Save(strPath);
return HTable;
}
读取xml文件时,用的是XMLDocument的Load方法读取的,如何释放呢,没有找到相关的方法。
在客户端的主窗体加载时,调用了ControlUpdate() 方法。
private void ControlUpdate()
{
HNativeTable = operateclass.SelectXML(strOldXmlName);
HServerTable = operateclass.SelectXML(strNewXmlName);
IDictionaryEnumerator IDEnumeratorNative = HNativeTable.GetEnumerator();
IDictionaryEnumerator IDEnumeratorServer = HServerTable.GetEnumerator();
string str = "";
while (IDEnumeratorNative.MoveNext())
{
if (str == "")
str = IDEnumeratorNative.Key.ToString();
else
str += "\n" + IDEnumeratorNative.Key.ToString();
}
//获取本地机器的最新版本
if (str.IndexOf("\n") != -1)
strOldVersion = str.Substring(str.LastIndexOf("\n") + 1, str.Length - str.LastIndexOf("\n") - 1);
else
strOldVersion = str;
//使用本地机器上的最新版本与服务器上的新版本进行比较
while (IDEnumeratorServer.MoveNext())
{
if (string.Compare(strOldVersion, IDEnumeratorServer.Key.ToString()) < 0)
list.Add(IDEnumeratorServer.Key.ToString());
}
if (list.Count > 0)
{
ClientUpdateForm clientUpdateForm = new ClientUpdateForm();
clientUpdateForm.Show();
}
else
{
MessageBox.Show("当前版本已经是最新版本,不需要升级!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
其中的 HNativeTable = operateclass.SelectXML(strOldXmlName);
HServerTable = operateclass.SelectXML(strNewXmlName);
就是导致问题的所在,由于第一次调用SelectXML时,xml文件没有关闭,导致第二次无法读取xml文件,这个问题,我没有找到解决方法,您给我一点代码提示好吗?
而我对进程那块不太懂,您能否附上相应的代码或者释放XML文件的解决办法。
多谢老师了,我都纠结了两天了,拜托老师了!
public Hashtable SelectXML(string strPath)
{
Hashtable HTable = new Hashtable();
XmlDocument doc = new XmlDocument();
doc.Load(strPath);
//获取NewDataSet节点的所有子节点
XmlNodeList xnl = doc.SelectSingleNode("UpdCfg").ChildNodes;
string strVersion = "";
string strInfo = "";
foreach (XmlNode xn in xnl)//遍历UpdCfg节点下的所有子节点
{
XmlElement xe = (XmlElement)xn; //将子节点类型转换为XmlElement类型
if (xe.Name == "Upgrade") //判断节点名为Upgrade
{
XmlNodeList xnlChild = xe.ChildNodes; //继续获取xe子节点的所有子节点
foreach (XmlNode xnChild in xnlChild) //遍历Upgrade节点下的所有子节点
{
XmlElement xeChild = (XmlElement)xnChild; //转换类型
if (xeChild.Name == "Version")
{
strVersion = xeChild.InnerText;
}
if (xeChild.Name == "UpdInfo")
{
strInfo = xeChild.InnerText;
}
}
HTable.Add(strVersion, strInfo);
}
}
doc.Save(strPath);
return HTable;
}
读取xml文件时,用的是XMLDocument的Load方法读取的,如何释放呢,没有找到相关的方法。
在客户端的主窗体加载时,调用了ControlUpdate() 方法。
private void ControlUpdate()
{
HNativeTable = operateclass.SelectXML(strOldXmlName);
HServerTable = operateclass.SelectXML(strNewXmlName);
IDictionaryEnumerator IDEnumeratorNative = HNativeTable.GetEnumerator();
IDictionaryEnumerator IDEnumeratorServer = HServerTable.GetEnumerator();
string str = "";
while (IDEnumeratorNative.MoveNext())
{
if (str == "")
str = IDEnumeratorNative.Key.ToString();
else
str += "\n" + IDEnumeratorNative.Key.ToString();
}
//获取本地机器的最新版本
if (str.IndexOf("\n") != -1)
strOldVersion = str.Substring(str.LastIndexOf("\n") + 1, str.Length - str.LastIndexOf("\n") - 1);
else
strOldVersion = str;
//使用本地机器上的最新版本与服务器上的新版本进行比较
while (IDEnumeratorServer.MoveNext())
{
if (string.Compare(strOldVersion, IDEnumeratorServer.Key.ToString()) < 0)
list.Add(IDEnumeratorServer.Key.ToString());
}
if (list.Count > 0)
{
ClientUpdateForm clientUpdateForm = new ClientUpdateForm();
clientUpdateForm.Show();
}
else
{
MessageBox.Show("当前版本已经是最新版本,不需要升级!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
其中的 HNativeTable = operateclass.SelectXML(strOldXmlName);
HServerTable = operateclass.SelectXML(strNewXmlName);
就是导致问题的所在,由于第一次调用SelectXML时,xml文件没有关闭,导致第二次无法读取xml文件,这个问题,我没有找到解决方法,您给我一点代码提示好吗?
而我对进程那块不太懂,您能否附上相应的代码或者释放XML文件的解决办法。
多谢老师了,我都纠结了两天了,拜托老师了!