0

我正在使用 ASP.NET C# 并使用 XmlDataSource 工具编写了一个页面来读取 xml 文件并在 GridView 中显示数据。当文件在那里时,一切都很好。但是,xml 文件每小时生成一次,如果您在更新文件时碰巧连接到页面(大约需要 2 分钟),则会显示错误(因为文件不存在)。当我使用内置工具连接和读取 xml 时,是否有代码可用于检查文件是否存在,如果不存在,则打开没有文件的页面。

我可以看到有代码可以执行 if 存在,但是我似乎无法弄清楚“该怎么做?”部分。忽略 XMLDataSource 工具。也许我可以让一个标签出现,说几分钟后回来,但我如何让它忽略数据阅读器?

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

2 回答 2

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
}

这样一来,没有其他过程可以将地毯从您的脚下拉出来。您知道该文件在那里,因为您已将其打开。

于 2012-04-19T20:05:47.987 回答
0

这是我的解决方案。我更改变量名称以保护无辜者。非常感谢吉姆米歇尔...

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;
    }
}
于 2012-04-20T12:48:26.223 回答