none
FileNotFoundException 找不到檔案 RRS feed

  • 問題

  • XP
    C#
    VS 2008
    ACCESS 2003
    win專案

    各位前輩:

    我今天遇到一個怪問題

    using System.xml;
    using System.IO;

                    XmlDocument xmlFile = new XmlDocument();
                    xmlFile.Load("a.xml");

                    string oldP = "";
                    string newP = "";
                    int newPId;

                    if (!File.Exists("p.log"))
                    {
                        using (StreamReader sr = File.OpenText("p.log"))
                        {
                            oldP = sr.ReadToEnd();
                        }
                    }

    程式執行時
    有時會在xmlFile.Load("data.xml");或using (StreamReader sr = File.OpenText("PersonalId.log"))跳出FileNotFoundException
    有時又不會
    之前都完全沒問題

    我有去看它找尋的路徑
    當發生Exception時會在C:\Documents and Settings\電腦名稱\桌面下找以上二個檔案

    我有試著把路徑改為絕對路徑
    就不會出錯了

    麻煩各位前輩的指導,謝謝!!

    2009年2月9日 上午 08:54

解答


  • xmlFile.Load("a.xml");
    應該是讀取於程式的相對路徑下
    但執行時
    會自動轉向C:\Documents and Settings\電腦名稱\桌面去

    你可以用
    1) For Web, Server.MapPath("~/a.xml");
    2) For Win,  Application.StartupPath + "//a.xml"

    去把它固定在執行路徑


    Microsoft MVP, Microsoft Community Star(TW & HK), MCT, MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA
    • 已標示為解答 meganHsu 2009年2月11日 上午 06:53
    2009年2月9日 上午 10:09

所有回覆

  • 如果你是在Debug Mode時,它會從[Application Folder]\Bin\Debug\中去找a.xml 
    如果你是在Release Mode時,它會從[Application Folder]\Bin\Debug\中去找a.xml 
    如果你是直接執行時,它會從[Execute Folder]\中去找a.xml

    另外,你的code有問題,如果p.log不存在時,你用StreamReader去開p.log,那肯定會跳出FileNotFoundException。
    你是不是想,當p.log存在時,用File.OpenText去開它?如果是,你應該是 if (File.Exists("p.log")) 去查才對


    Microsoft MVP, Microsoft Community Star(TW & HK), MCT, MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA
    2009年2月9日 上午 09:19
  • 前輩:

    我知道程式執行時的預設路徑
    是在你說的位置

    xmlFile.Load("a.xml");
    應該是讀取於程式的相對路徑下
    但執行時
    會自動轉向C:\Documents and Settings\電腦名稱\桌面去

    確認檔案是否存在的部份
    是我不小心寫錯了
    多加了【!】

    謝謝前輩的指導 ^^
    2009年2月9日 上午 09:37
  • 相對路徑是對於目前執行路徑來看
    而目前執行路徑又會隨著程式更動
    像是OpenFileDialog元件選取檔案時就有可能會改到目前執行路徑
    因此還是用絕對路徑來指定會比較好

    變通辦法可以取得程式執行路徑
    再把程式執行路徑跟相對路徑做Combine

    或是執行前先把目前執行路徑改回成程式執行路徑

    可參考
    2009年2月9日 上午 09:52

  • xmlFile.Load("a.xml");
    應該是讀取於程式的相對路徑下
    但執行時
    會自動轉向C:\Documents and Settings\電腦名稱\桌面去

    你可以用
    1) For Web, Server.MapPath("~/a.xml");
    2) For Win,  Application.StartupPath + "//a.xml"

    去把它固定在執行路徑


    Microsoft MVP, Microsoft Community Star(TW & HK), MCT, MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA
    • 已標示為解答 meganHsu 2009年2月11日 上午 06:53
    2009年2月9日 上午 10:09