【问题标题】:Exception during xml processing [duplicate]xml处理期间的异常[重复]
【发布时间】:2013-04-05 12:05:46
【问题描述】:

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

c# Exception The process cannot access the file

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

有人可以说明原因吗,为什么它在运行 exe 而不是在调试模式下给出异常。

我第一次运行 exe 时,它​​成功运行并为我提供了我需要的 xml 输出。但是对于观察者的第二个发现。它给了我这个例外:进程无法访问文件。

【问题讨论】:

  • 如果您不需要以原始形式写入 xml 文件本身,您可以尝试将其作为只读/共享文件流打开,然后从那里加载 XmlDocument 对象,而不是使用 XmlDocument基础,它可能不会给你那么多的选择......
  • @Nevyn:我正在使用 XMLDocument 来验证 XML 是否完美,如果不是,我会使用 catch 添加缺失的标签,因为有时我会得到没有缺失标签的 xml,如您所见在 xdoc XMLDOCUMENT 之后的捕获中。有没有其他办法呢
  • 我不是说要使用 XmlDocument 以外的东西,我是说最初使用 FileStream 打开文件...这为您提供了更多选项,例如 ReadOnly 和/或 Shared,然后从 FileStream 加载 XmlDocument。这可能会让你绕过最初的问题。现在,您仍然有格式错误的 xml 的问题并且必须修复原始文件,但是一旦我们解决了第一个问题,就可以解决这个问题。一次一件事:-)
  • @user726720 +1 回答您的问题。
  • 不客气,伙计@user726720

标签: c# .net exception io


【解决方案1】:

我查看了完整的代码集......您遇到的问题与事件和时间有关。在保存文件的任何进程放开它之前,您的事件是从 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);

        //...

【讨论】:

  • 是的,亲爱的,它有效。以及下面 Luke Marlin 的监视器 sn-p
  • @Nevyn So +1 为您解答。 :)
【解决方案2】:

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

尝试如下操作:

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

【讨论】:

  • 当然,让我试试。
  • @user726720 有效吗?
  • 不,兄弟,它是一样的:进程无法访问该文件。我一直在努力解决这个问题一个星期,到目前为止没有结果
  • @user726720 你能告诉我包含我的建议的完整代码吗?
  • 是的,如果你的锁在第一个if 这样的语句中,没有其他线程可以进入并引发异常。有效吗?
【解决方案3】:

您的 EXE 进程正在持续运行。您的 exe 进程可能应该停止。那么“进程无法访问文件”错误将永远不会出现。对您的代码使用适当的错误处理技术。您的代码与 XML 文件有持续的通信。所以,如果你第二次尝试访问,如果我没记错的话,访问错误就来了。

【讨论】:

  • +1 帮助我。谢谢
【解决方案4】:

这里是最后一个可以正常工作的 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();
        }
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多