4

例外が発生しています: プロセスがファイルにアクセスできません。

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

if (!Monitor.TryEnter(lockObject))
    return;
try
{
    watcher.EnableRaisingEvents = false;
    try
    {
        XmlDocument xdoc = new XmlDocument();
        xdoc.Load(FileName);
        xdoc = null;
    }
    catch (XmlException xe)
    {
        using (StreamWriter w = File.AppendText(FileName))
        {
            Console.WriteLine(xe);
            w.WriteLine("</test>");
            w.WriteLine("</testwrapper>");
        }
    }
    System.Threading.Thread.Sleep(2000);
    XPathDocument myXPathDoc = new XPathDocument(new StreamReader(FileName, System.Text.Encoding.GetEncoding("windows-1256")));
    XslCompiledTransform myXslTrans = new XslCompiledTransform();
    myXslTrans.Load("D:/GS/xsl/test.xsl");
    XmlTextWriter myWriter = new XmlTextWriter(destinationFile, null);
    myWriter.Formatting = Formatting.Indented;
    myWriter.Indentation = 4;
    myXslTrans.Transform(myXPathDoc, null, myWriter);
    myWriter.Close();
}
catch (Exception e)
{
    Console.WriteLine("The process failed: {0}", e.ToString());
}
finally
{
    Monitor.Exit(lockObject);
    watcher.EnableRaisingEvents = true;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
}

これらの行を追加する前に、コードは完全に機能していました。これらは主に、xml ファイルに終了タグがないかどうかをテストするためのものです (これは通常取得してからタグを追加します)。次のコードを追加した後、この例外が発生し始めました。

try
{
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(FileName);
    xdoc = null;

}
catch (XmlException xe)
{
    using (StreamWriter w = File.AppendText(FileName))
    {
        Console.WriteLine(xe);
        w.WriteLine("</test>");
        w.WriteLine("</testwrapper>");
    }
}             

ここで何が間違っている可能性がありますか?

編集:私が得ているエラー

プロセスが失敗しました: System.IO.IOException: 別のプロセスによって使用されているため、プロセスはファイル 'z :\TF_B1BBA.xml' にアクセスできません。System.IO.__Error.WinIOError (Int32 errorCode、String MaybeFullPath) で System.IO.FileStream.Init (String パス、FileMode モード、FileAccess アクセス、I nt32 権限、ブール値の useRights、FileShare 共有、Int32 bufferSize、FileOptions オプション、 SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean n useLongPath) を System.IO.FileStream..ctor (String パス、FileMode モード、FileAccess アクセス、FileShare 共有、Int32 bufferSize) で System.Xml.XmlDownloadManager.GetStream (Uri uri、 System.Xml の System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri、String role、Type ofO bjectToReturn) の ICredentials 資格情報、IWebProxy プロキシ、RequestCachePolicy cachePolicy)。System.Threading.CompressedStack.runTryCode(Object userData) の XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver) System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode コード、CleanupCode backoutCode、Object userData) System.Xml.XmlTextReaderImpl.OpenUrl() での System.Xml.XmlTextReaderImpl.Read() での圧縮スタック、Cont extCallback コールバック、オブジェクト状態)。System.Xml.XmlLoader.Load(XmlDocument ドキュメント、XmlReader リーダー、ブール値 prese veWhitespace) で System.Xml.XmlDocument.Load(XmlReader リーダー) で System.Xml.XmlDocument.Load(文字列ファイル名) で GSelInterface.Program.convert( C のオブジェクト ソース、FileSystemEventArgs f):

4

5 に答える 5

4

ウォッチャーが原因である可能性があります (その場合、FileShare.ReadWrite が重要な部分です)。

試す:

XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);
于 2013-04-05T12:31:35.120 に答える
4

try ブロックで、ファイルを開きました。閉じる必要があります。

XmlDocument xdoc = new XmlDocument();
xdoc.Load(FileName);

この例に従ってください。

http://msdn.microsoft.com/en-us/library/zcsyk915.aspx

于 2013-04-04T12:32:21.720 に答える
0

try ブロックで既に開いている "Filename" ファイルに書き込もうとしています。

編集1:

ファイルを保存しているプロセスによってロックが設定されているようです。convert() が起動されたとき、ファイルシステムはまだファイルの保存を完了していません。大きなxmlがある場合に特に発生します。ファイルを書き込もうとする直前にスリープを追加すると、例外は発生しません。

これはクイック & ダーティ パッチです。

xml ファイルが頻繁に保存される場合は、変更された xml ファイルに何らかのロックを追加する必要があります。

編集2:

また、何かを行う前にウォッチャーのイベントを削除し、すべてが完了したら再度追加して、複数のイベントが発生しないようにしてください。EnableRaisingEvents = false が正しく機能するかどうかはわかりません。この投稿も参照してください。

EnableRaisingEvents (有効化と無効化)

try
{
    watcher.EnableRaisingEvents = false;
    //Edit2: Remove the watcher event
    watcher.Changed -= new FileSystemEventHandler(convert);

    try
    {
      XmlDocument xdoc = new XmlDocument();
      xdoc.Load(FileName);
    }
    catch (XmlException xe)
    {
      System.Threading.Thread.Sleep(1000);  //added this line
      using (StreamWriter w = File.AppendText(FileName))
      {
        Console.WriteLine(xe);
        w.WriteLine("</test>");
        w.WriteLine("</testwrapper>");
      }
    }
}

/*
   Here all xslt transform code
*/

    //Edit2: Add again the watcher event
    watcher.Changed += new FileSystemEventHandler(convert);
}
catch (Exception e)
{
   Console.WriteLine("The process failed: {0}", e.ToString());
}
于 2013-04-04T12:30:09.310 に答える
0

ファイルが存在しないことを確認してください。

ビルド構成を再作成する必要がありましたが、古いファイルがまだ存在していました。古い変換を削除すると、新しい変換を再作成できました。

于 2016-07-19T16:37:49.327 に答える