2012-04-19 85 views
0

我正在使用ASP.NET C#並使用XmlDataSource工具編寫了一個頁面來讀取xml文件並在GridView中顯示數據。當文件在那裏時,一切都很棒。但是,xml文件每小時生成一次,如果在文件更新期間碰巧連接到頁面(大約需要2分鐘),則會顯示錯誤(因爲文件不存在)。當我使用內置工具來連接和讀取XML時,是否有代碼可用於檢查文件是否存在,如果不存在,則打開沒有文件的頁面。如果xml文件不存在

我可以看到有代碼做if存在,但我似乎無法弄清楚「該做什麼?」部分。忽略XMLDataSource工具。也許我可以讓一個標籤出現,說幾分鐘後回來,但我怎麼讓它忽略數據讀取器?

if (!File.Exists(filename)) 
{ 
    // what to do? 
} 
+1

我在這裏猜測了一下,但你可以a)設置一個空的xml(?)b)將null設置爲數據源c)不顯示gridview(set可見錯誤) – 2012-04-19 19:33:51

+0

我不確定可以添加多少自定義邏輯,如果可以,可以將xml文件生成爲名爲「myxmlfile_generating.xml」的文件,並在完成後刪除舊的xml文件並重命名新的一個是原始文件名。那麼當它不可用時你只需要很短的時間。當然,你應該儘管處理這種情況。 – MatthiasG 2012-04-19 19:44:00

+0

我可以將gridview和formview設置爲false,但是xmldatasource仍會嘗試讀取文件。我不知道將xmldatasource設置爲不執行的確切代碼。 – user1188241 2012-04-19 19:50:59

回答

2

如果您嘗試以這種方式使用File.Exists,您會感到失望。

比方說,你有一些代碼最簡單的方式工作:

if (!File.Exists(filename)) 
{ 
    // Tell user that file isn't there. 
} 
else 
{ 
    // The file exists, so now go party on it. 
    DoSomething(filename); 
} 

所以,你的程序確定該文件存在。但在調用DoSomething之前,創建該文件的過程將打開該文件以進行獨佔訪問。然後你的DoSomething方法就會失敗。所以你檢查文件的存在是無關緊要的。

是的,這是一個非常小的窗口。我可以從經驗告訴你,事情確實發生在那些非常小的窗口內。我被類似上面的代碼咬了。

我強烈建議您編寫代碼,以便它處理文件不存在時引發的FileNotFoundException(或任何異常)。例如:

try 
{ 
    DoSomething(filename); 
    // now format the page as normal 
} 
catch (FileNotFoundException) 
{ 
    // notify user that the file wasn't found 
} 

完成這樣的事情後,沒有其他過程可以從您的下方拉出地毯。您知道該文件在那裏,因爲它已經打開。

+0

Thx,我試過但我仍然得到錯誤:'protected void Page_Load(object sender,EventArgs e) {xmlFile = Server.MapPath(「〜/ App_Data/diskspace.xml」); 嘗試 { XmlDS.DataFile = xmlFile; XmlDS.EnableCaching = true; XmlDS.CacheDuration = 6000; XmlDS.CacheExpirationPolicy = DataSourceCacheExpiry.Absolute; XmlDS。的DataBind(); } catch(Exception ex) { lblE.Visible = true; GV.Visible = false; FV.Visible = false; }' } – user1188241 2012-04-19 20:32:49

+0

@ user1188241:你得到什麼錯誤? catch代碼塊中的代碼是否實際執行? – 2012-04-19 20:41:07

+0

更新 - 我發現這種方法,它的工作原理。試試吧。我只需要做更多的測試。 'XmlDS.GetXmlDocument(); – user1188241 2012-04-19 20:43:29

0

這是我的解決方案。我改變變量名稱以保護無辜者。非常感謝吉姆Mischel ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    string xmlFile = Server.MapPath("~/App_Data/file.xml"); 

    try 
    { 
     XmlDataSource1.DataFile = xmlFile; 
     XmlDataSource1.GetXmlDocument(); 
    } 
    catch (Exception ex) 
    { 
     lblErrorMessage.Visible = true; 
     gridView1.Visible = false; 
     formView1.Visible = false; 
    } 
}