0

私は ASP.NET C# を使用しており、XmlDataSource ツールを使用して xml ファイルを読み取り、GridView にデータを表示するページを作成しました。ファイルがそこにあるとき、すべてが素晴らしいです。ただし、xml ファイルは 1 時間ごとに生成され、ファイルの更新中 (約 2 分かかります) にページに接続すると、エラーが表示されます (ファイルが存在しないため)。組み込みツールを使用してxmlに接続して読み取るため、ファイルが存在するかどうかを確認し、存在しない場合はファイルなしでページを開くために使用できるコードがあります。

存在する場合を実行するコードがあることはわかりますが、「何をすべきか」という部分を理解できないようです。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 に答える