请教各位,我的菜单结构是存储在一个.XML文件中的,在编译环境下运行都没问题,但是发布出来后就说路径不对,找不到我发布的.XML文件,提示为:未能找到路径“C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\frame\menu.xml”的一部分。
我到“C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\”看了下,确实没有frame文件夹,然后我吧frame文件夹还有menu.xml文件一同拷到目录下,可是运行程序还是一样的提示,请大家帮忙,谢谢!!

解决方案 »

  1.   

    你确信这个文件已存在?“C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\frame\menu.xml”??
      

  2.   

    程序刚发布时候是没有的,我是后面手动把frame\menu.xml文件拷贝到C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC这个目录下的。目前确实存在!
      

  3.   

    private void CreateMenu()
            {
                //定义一个主菜单
                MenuStrip mainMenu = new MenuStrip();
                DataSet ds = new DataSet();
                string strMenuXml = Application.StartupPath.ToString() + @"\..\..\frame\mune.xml";
                ds.ReadXml(strMenuXml);
                DataView dv = ds.Tables[0].DefaultView;
                //通过DataView来过滤数据首先得到最顶层的菜单
                dv.RowFilter = "ParentItemID=0";
                for (int i = 0; i < dv.Count; i++)
                {
                    //创建一个菜单项
                    ToolStripMenuItem topMenu = new ToolStripMenuItem();
                    //给菜单赋Text值。也就是在界面上看到的值。
                    topMenu.Text = dv[i]["Text"].ToString();
                    //如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单
                    if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
                    {
                        //以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。
                        CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["ItemID"]), ds.Tables[0]);
                    }
                    //显示应用程序中已打开的 MDI 子窗体列表的菜单项
                    mainMenu.MdiWindowListItem = topMenu;
                    //将递归附加好的菜单加到菜单根项上。
                    mainMenu.Items.Add(topMenu);
                }
                mainMenu.Dock = DockStyle.Top;
                //将窗体的MainMenuStrip梆定为mainMenu.
                this.MainMenuStrip = mainMenu;
                //这句很重要。如果不写这句菜单将不会出现在主窗体中。
                this.Controls.Add(mainMenu);
            }这个是我的部分代码。编译环境下是没有问题的,我也奇怪呢,怎么出这问题了!!!
      

  4.   

    我建议你先把这个路径改一下 例如改成 C:\frame\menu.xml不要使用这种和操作系统用户相关的路径 以防读去权限出现问题
      

  5.   

    string strMenuXml = Application.StartupPath.ToString() + @"\..\..\frame\mune.xml";
    不要这样用 改成 string strMenuXml = Application.StartupPath.ToString() + @"\frame\mune.xml";
    然后就在当前exe的目录下建立\frame\mune.xml 例如 exe在 D:\program\App目录下则建立 D:\program\App\frame\mune.xml
      

  6.   

    呵呵,谢谢这位仁兄,我刚把路径改成死的了, string strMenuXml = @"D:\shuntong_xs\st_manager\frame\mune.xml";这样就好了,我晕,我再试试你这种方法。
      

  7.   

    jiatong1981(末日之痕)  有道理
      

  8.   

    我哭,jiatong1981(末日之痕) 您给的方法我也试验过了,还是不行!他还是到那个路径下找frame\mune.xml文件,不过还是提示找不到!
      

  9.   

    用jiatong1981(末日之痕) 的方法,现在程序要找的路径又多了一级,在“C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\st_m..tion_36016e4b63d84d89_0001.0001a6fcfe321f2d5f7      \frame\menu.xml“
      

  10.   

    @"\..\..\frame\mune.xml";//   ..\是代码寻找当前运行目录的上一级目录 你两个.. 就是向上寻找两级目录而 @".\frame\mune.xml";//  .\是代码寻找当前运行的同级目录 首先把这个..和.给你讲清楚
      

  11.   

    用死路径就可以:
    string strMenuXml = @"D:\shuntong_xs\st_manager\frame\mune.xml";
    用jiatong1981(末日之痕)的方法就是下面的写法,但是还是说未能找到路径:
    string strMenuXml = Application.StartupPath.ToString() + @"\frame\mune.xml";
      

  12.   

    debug 调试 看看string strMenuXml = Application.StartupPath + @"\frame\mune.xml";看看 strMenuXml= ?
      

  13.   

    我的D:\shuntong_xs\st_manager就是根目录。
      

  14.   

    strMenuXml= ”D:\\shuntong_xs\\st_manager\\bin\\Debug\\frame\\mune.xml“
      

  15.   

    Application.StartupPath是取得当前exe运行目录哦假如你的exe在桌面上 那么 这个值就等于例如C:\Documents and Settings\Administrator\桌面和你的安装目录是无关的
      

  16.   

    请教怎么解决啊!
    按道理说strMenuXml=”D:\shuntong_xs\st_manager\frame\mune.xml“才对啊!
    晕了。
      

  17.   

    strMenuXml= ”D:\\shuntong_xs\\st_manager\\bin\\Debug\\frame\\mune.xml“
    按照这个目录建立相应文件然后你运行debug 路径使用 @".\frame\mune.xml"我就不信还不行
      

  18.   

    不好意思,还是发布出来就不行了,跟上面的提示一样,
    未能找到路径“C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\st_m..tion_36016e4b63d84d89_0001.0001a6fcfe321f2d5f7\frame\menu.xml“
      

  19.   

    说不清楚了 我不知道你现在报错时exe是在那里运行的假如 你目前在 D:\program files\app\Application1.exe 运行这个app.exe路径使用 string strMenuXml = Application.StartupPath + @"\frame\mune.xml";那么 你就需要有 D:\program files\app\frame\mune.xml 这个东东
      

  20.   

    C:\Documents and Settings\we\Local Settings\Apps\2.0\PXXV1GOP.VTC\st_m..tion_36016e4b63d84d89_0001.0001a6fcfe321f2d5f7\frame\menu.xml“=================================================================
    st_m..tion_36016e4b63d84d89_0001.0001a6fcfe321f2d5f7怎么会有这么奇怪的文件夹名字?
      

  21.   

    ok 你如果着急 可以先写成死的路经然后保证该路径下的xml文件存在即可至于你的问题 肯定是相关代码那里出现了些小状况 我要回家料 希望lx的帮你搞定
      

  22.   

    呵呵,谢谢jiatong1981(末日之痕) !
      

  23.   

    XML打倒资源里不就行了,找不到时就写一份到路径里,有就不写了。解决这种异常。
      

  24.   

    要用mage.exe或mageui.exe发布ClickOnce
      

  25.   

    晕点 还是没明白为何会出现这状况这样尝试呢?string strMenuXml = Application.StartupPath + @"..\frame\mune.xml";
      

  26.   

    问题解决了:
    1、首先打开项目属性--->发布--->应用程序文件--->把frame\mune.xml文件的发布状态改为包括。
    2、在引用路径的时候这么写“string strMenuXml = Directory.GetCurrentDirectory() + "\\frame\\mune.xml"; ”
    通过上面两个步骤把问题解决了。
    谢谢各位,特别是 jiatong1981(末日之痕) ,lambober(星之劫),hhyytt(鹦鹉螺)