我收到异常:进程无法访问该文件。
以下是代码:
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(字符串路径,FileMode模式,FileAccess访问,我 nt32 rights,布尔值useRights,FileShare共享,Int32 bufferSize,FileOptions o ptions,SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,Boolea n useLongPath) 在System.IO.FileStream..ctor(字符串路径,FileMode模式,FileAccess访问, FileShare共享,Int32 bufferSize) 在System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials credentials, IWebProxy代理,RequestCachePolicy cachePolicy) 在System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,String role,Type ofO) bjectToReturn) 在System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver) 在System.Threading.CompressedStack.runTryCode(Object userData) 在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl eanup(TryCode代码,CleanupCode backoutCode,Object userData) 在System.Threading.CompressedStack.Run(CompressedStack compressedStack,Cont extCallback回调,对象状态) 在System.Xml.XmlTextReaderImpl.OpenUrl() 在System.Xml.XmlTextReaderImpl.Read() 。在System.Xml.XmlLoader.Load(XmlDocument doc,XmlReader reader,Boolean prese) veWhitespace) 在System.Xml.XmlDocument.Load(XmlReader阅读器) 在System.Xml.XmlDocument.Load(String filename) 在C:\的GSelInterface.Program.convert(Object source,FileSystemEventArgs f)中 Documents and Settings \ Administrator \ Desktop \ ConsoleApplication1 \ ConsoleApplicat ion1 \ Program.cs:第178行
答案 0 :(得分:4)
在您的try块中,您已打开该文件。你需要关闭它。
XmlDocument xdoc = new XmlDocument();
xdoc.Load(FileName);
请遵循此示例。
答案 1 :(得分:4)
可能是因为观察者(然后FileShare.ReadWrite是重要部分)。
尝试:
XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);
答案 2 :(得分:0)
您正在尝试写入已在try块中打开的“Filename”文件。
编辑1:
似乎锁定是由保存文件的进程设置的。 当触发convert()时,文件系统仍未完成保存文件。 特别是如果你有一个大的xml,它会发生。 如果在尝试写入文件之前添加睡眠,则不会引发异常。
这是一个快速而又肮脏的补丁。
如果以高频率保存xml文件,则需要为更改的xml文件添加某种锁定。
编辑2:
尝试在执行操作之前删除观察者的事件,并在完成所有操作后再次添加,以防止触发多个事件。 不确定EnableRaisingEvents = false将以正确的方式工作。 另见这篇文章:
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());
}
答案 3 :(得分:0)
答案 4 :(得分:0)
确保该文件不存在。
我不得不重新创建我的构建配置,旧文件仍然存在。删除旧转换后,我可以重新创建新转换。