做WinForm时,自已遇到了这个问题,情况和这位仁兄的差不多:“winform程序发布后,找不到菜单存储文件(xml文件)”。
情景再现:在c#winform项目中建立一个XML数据文件在\data\demo.xml中,另有一些图片文件在\images\目录中,发布后安装在其它电脑上面,调试时没有问题,运行时会报“未找到路径:C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\…”之类。但是图片的调用没有问题。
解释一下几个相关问题:
这个问题可能要问MS了,不过从vs2003以来,C#的 winform发布后的程序都会自动安装在X:\Documents and Settings\用户名\Local Settings\Apps\[.net版本]…的目录中,可能是为了方便程序的升级、卸载、版本回滚等,可以跟vista以后的平台配合。
如果XML数据文件位于\Data\demo.xml,那在程序调试的时候,应用程序的运行地址在:\bin\Debug\App.exe,所以引用时应该这样写:
XmlDocument objXmlDoc = new XmlDocument();
objXmlDoc.Load(@"..\..\Data\demo.xml");
也可以写成:objXmlDoc.Load(Application.StartupPath.ToString()+@"..\..\Data\demo.xml");
Application.StartupPath会返回应用程序所以在的位置。
跟据MS的思路,XML属于“数据文件”,而图片等属于“资源文件”,安装后所有的数据文件将被安装后其它目录,而资源文件会被放置到程序安装路径中。右键项目,点“属性”,在发布选项卡中点“应用程序文件…”会看到所有除了.cs的文件的发布状态,png是包括(自动发布),而xml是数据文件(自动发布)。
使用Application.CommonAppDataPath,它会自动指向程序的数据目录安装位置:
XmlDocument objXmlDoc = new XmlDocument();
objXmlDoc.Load(Application.CommonAppDataPath+@"\Data\demo.xml");
但是如果是本机开发,Application.CommonAppDataPath在调试时不会指向你的项目目录,而是指向X:\Documents and Settings\用户名\Local Settings\Apps\[.net版本]…,所以在调试(Debug)时不能用它来加载XML文件。
可以用#if DEBUG,使用如下代码,可以看到如果不是Debug状态,加载数据文件的语句是灰色的,是不被执行的:
当然,您也可以使用开始提到的那贴子中的方法:
1、首先打开项目属性---> 发布---> 应用程序文件---> 把frame\mune.xml文件的发布状态改为包括。
2、在引用路径的时候这么写“string strMenuXml=Directory.GetCurrentDirectory()+"\\frame\\mune.xml "; ”
原链接:http://www.cnblogs.com/fhmsha/archive/2009/01/25/c_sharp_winform_can_not_find_xml_ini_datafiles_when_published.html