2013-04-05 3 views
2

Я просто возвращаясь к моему вопросу здесь (пока не решено):Исключения при обработке XML

c# Exception The process cannot access the file

Исключение не происходит, когда я бег в режиме отладки, он только делает это когда я бегу от exe.

Может кто-нибудь объяснить ему причину, почему он дает исключение при запуске exe, а не в режиме отладки.

В первый раз, когда я запускаю exe, он работает успешно и дает мне xml-выход, который мне нужен. Но для второй находки для наблюдателя. Это дает мне это исключение: процесс не может получить доступ к файлу.

+0

Если вам не нужно писать самому XML-файл, в своем первоначальном виде, вы можете попробовать открыть его как ReadOnly/Shared FileStream, а затем загрузки объекта XmlDocument оттуда, а не с помощью базы XmlDocument, который может не дать вам столько опций ... – Nevyn

+0

@Nevyn: Я использую XMLDocument для проверки правильности XML, если я не использую catch для добавления недостающих тегов, потому что иногда я получаю xml без этих тегов как вы можете видеть в catch сразу после XMLDOCUMENT xdoc. Есть ли другой способ сделать это – user726720

+0

Я не говорю, чтобы использовать что-то другое, кроме XmlDocument, я говорю, чтобы открыть файл с использованием FileStream изначально ... который дает вам больше опций, таких как ReadOnly и/или Shared, а затем загружает XmlDocument из FileStream , Это может позволить вам решить начальную проблему. Теперь у вас все еще есть проблема с malformed xml и исправление исходного файла, но об этом можно позаботиться, как только мы зафиксируем первую проблему. Одна вещь за раз :-) – Nevyn

ответ

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); 

     //... 
+0

Да, сладкий, он работает. вместе с фрагментом монитора от Люка Марлина ниже – user726720

+0

Рад, что я мог бы помочь – Nevyn

+0

@Nevyn So +1 для вашего ответа. :) – RajeshKdev

3

Я думаю, что вы сделали свой замок неправильно, и поэтому несколько потоков пытаются получить Ваш файл

Попробуйте сделать следующее:

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

уверен, позвольте мне попробовать. – user726720

+0

@ user726720 Он работает? – RajeshKdev

+0

nope bro, это то же самое: процесс не может получить доступ к файлу. Я пытался понять это в течение недели, пока нет результатов – user726720

1

Ваш EXE процесс работает непрерывно. Вероятно, процесс вашего exe должен быть остановлен. Тогда ошибка «Процесс не может получить доступ к файлу» никогда не появится. Используйте правильные методы обработки ошибок для своих кодов. Ваш код имеет непрерывную связь с XML-файлом. Итак, если вы попытаетесь получить доступ во второй раз, ошибка доступа придет, если я не ошибаюсь.

+0

+1 за то, что помогли мне. Спасибо – user726720

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(); 
      } 

     } 

    } 

     } 
Смежные вопросы