xml处理期间的异常

时间:2013-04-05 12:05:47

标签: c# .net exception io

我只是在这里回答我的问题(尚未解决):

c# Exception The process cannot access the file

当我在调试模式下运行时,没有发生异常,它只在我从exe运行时才执行。

有人可以给它理由,为什么它在运行exe时给出异常而不是在调试模式下。

我第一次运行exe时,它成功运行并给我我需要的xml输出。但是第二次找到观察者。它给了我这个例外:进程无法访问该文件。

4 个答案:

答案 0 :(得分:3)

我认为你的锁定错了,因此多个线程试图获取你的文件

尝试按以下步骤操作:

if (Monitor.TryEnter(lockObject))
{
    try{
    //Your actual code
    }
}
else
    return;

答案 1 :(得分:3)

我看了一下完整的代码集......你遇到的问题与事件和时间有关。在保存文件的任何进程之前,您的事件将从FileWatcher对象触发。尝试将一个Thread.Sleep放在Convert方法的顶部...不需要太长,大概开始1秒左右......看看会发生什么。

    private static void convert(object source, FileSystemEventArgs f)
    {
        string FileName;
        FileName = f.FullPath;
        string FilePath;
        FilePath = f.Name;
                 var watcher = source as FileSystemWatcher;
             string destinationFile = @"D:/GS/" + FilePath;

        Thread.Sleep(1000);

        //...

答案 2 :(得分:1)

您的 EXE 进程正在持续运行。你的exe的过程可能应该停止。然后“进程无法访问文件”错误将永远不会到来。对代码使用适当的错误处理技术。您的代码与XML文件保持连续通信。因此,如果您尝试第二次访问,如果我没有错,则会出现访问错误。

答案 3 :(得分:0)

这是正常工作的最终convert()。感谢所有在这里帮助过我的人。我非常感谢您花时间和精力帮助我。我希望我能接受上述两种解决方案。但我正在向你们两个投票。再一次谢谢你。

private static void convert(object source, FileSystemEventArgs f)
{
    string FileName;
    FileName = f.FullPath;
    string FilePath;
    FilePath = f.Name;
    var watcher = source as FileSystemWatcher;
    string destinationFile = @"D:/GS/" + FilePath;
    System.Threading.Thread.Sleep(1000);
    if (Monitor.TryEnter(lockObject)) **
    {
        try
        {
            watcher.EnableRaisingEvents = false;
            XmlDocument xdoc = new XmlDocument();
            try
            {
                xdoc.Load(FileName);
                xdoc = null;
            }
            catch (XmlException xe)
            {
                xdoc = null;
                using (StreamWriter w = File.AppendText(FileName))
                {
                    Console.WriteLine(xe);
                    w.WriteLine("</title>");
                    w.WriteLine("</titleContent>");
                    Console.WriteLine("1st");
                }
            }
            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();
            Console.WriteLine("2nd");

        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
        finally
        {
            Monitor.Exit(lockObject);
            watcher.EnableRaisingEvents = true;
            Console.WriteLine("Finally");
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
        }
    }
}

}