1

私のアプリケーションはすでに動作しており、xml ファイルを検出して xml ファイルの内容を表示することができますが、「ルート要素が見つかりません」というメッセージが表示されることもあれば、問題ないこともありますが、xml ファイルを開くと問題ありません。内容があります。この問題を解決する方法。

エラーのスクリーンショットは次のとおりです。

ここに画像の説明を入力

コードは次のとおりです。

private void fileSystemWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
    {
        string invoice = "";
        using (var stream = System.IO.File.Open(e.FullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
        {
            var doc = System.Xml.Linq.XDocument.Load(stream);
            var transac = from r in doc.Descendants("Transaction")
                          select new
                          {
                              InvoiceNumber = r.Element("InvoiceNumber").Value,
                          };

            foreach (var i in transac)
            {
                invoice = i.InvoiceNumber;
            }
        }

        MessageBox.Show(invoice);
        fileSystemWatcher.EnableRaisingEvents = false;
    }

ここにエラーが表示されますvar doc = System.Xml.Linq.XDocument.Load(stream);

4

2 に答える 2

3

ファイルが変更されると、FileSystemWatcher は非常に迅速にイベントを発生させます。ファイルを読み取る前に、書き込み操作が完了していない可能性があります。

Thread.Sleep(100);それをテストするには、簡単な回避策として、ファイルを読み取る前にa を追加します。

より良い解決策を得るには、ファイルを共有モードで開かず、排他的に開くことができるかどうか試してください。これが失敗した場合は、ファイルを排他的に開くことができるまで、数ミリ秒待ってから再試行してください。また、イベントが複数回トリガーされる可能性があることに注意してください。これは、他のタスクがファイルに書き込む方法によって異なります。

于 2012-11-23T22:54:09.920 に答える
2

ファイルが作成され、別の手順で書き込まれると、競合状態が発生する可能性があります。したがって、作成されたイベントが発生したときに空のファイルが存在し、例外が発生することがあります。Createdでイベントが発生した後、しばらく待つ必要がChangedありFileSystemWatcherます。Changedまた、大量の書き込みが行われている場合、すべてのコンテンツがファイルに表示されるまでにいくつかのイベントが発生することに注意してください。

于 2012-11-23T22:54:01.457 に答える