Reputation: 1237
I'm getting an exception: The process cannot access the file.
Here's the code:
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();
}
The code was working perfectly before I added these lines. These are mainly for testing if the xml file is without the closing tags (which) I normally get then add the tags. After I added the following code it started giving me this exception.
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>");
}
}
What could be wrong here ?
EDIT: Error I'm getting
The process failed: System.IO.IOException: The process cannot access the file 'z :\TF_B1BBA.xml' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, I nt32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions o ptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolea n useLongPath) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofO bjectToReturn) at System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver) at System.Threading.CompressedStack.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl eanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.CompressedStack.Run(CompressedStack compressedStack, Cont extCallback callback, Object state) at System.Xml.XmlTextReaderImpl.OpenUrl() at System.Xml.XmlTextReaderImpl.Read() . at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean prese veWhitespace) at System.Xml.XmlDocument.Load(XmlReader reader) at System.Xml.XmlDocument.Load(String filename) at GSelInterface.Program.convert(Object source, FileSystemEventArgs f) in C:\ Documents and Settings\Administrator\Desktop\ConsoleApplication1\ConsoleApplicat ion1\Program.cs:line 178
Upvotes: 5
Views: 14473
Reputation: 3390
Make sure the file does not exist.
I had to recreate my build configuration and the old file still existed. Once I deleted the old transform I was able to recreate the new transform.
Upvotes: 0
Reputation: 1237
The solution to this problem is right at this link:
Exception during xml processing
This was another question I raised. Thank you all of you who spent their time in helping me out.
Upvotes: 0
Reputation: 5373
It may be because of the watcher (then FileShare.ReadWrite is the important part).
Try:
XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);
Upvotes: 4
Reputation: 822
You are trying to write on "Filename" file that is already open in the try block.
Edit 1:
It seems the lock is set by the process that is saving the file. When convert() is fired, filesystem has still not finished to save the file. It happens expecially if you have a big xml. If you add a sleep just before trying to write the file, exception is not raised.
This is a quick&dirty patch.
If xml files are saved with an high frequency, you need to add some kind of lock to the xml file changed.
Edit 2:
Try also to remove watcher's event before doing stuff, and add again after everything is done, so you prevent multiple events to be fired. Not so sure that EnableRaisingEvents = false will work in the right way. See this post also:
EnableRaisingEvents (enabling and disabling it)
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());
}
Upvotes: 0
Reputation: 7267
In your try block you have opened the file. You need to close it.
XmlDocument xdoc = new XmlDocument();
xdoc.Load(FileName);
Follow this example.
http://msdn.microsoft.com/en-us/library/zcsyk915.aspx
Upvotes: 4