c#异常进程无法访问文件
本文关键字:访问 文件 异常 进程 | 更新日期: 2023-09-27 18:07:19
我得到一个异常:进程无法访问文件。
代码如下:
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>");
}
}
哪里出错了?
EDIT: Error I'm get
The process failed: System.IO.IOException: The process cannot access The file 'z .
The process failed:'TF_B1BBA.xml',因为它正在被其他进程使用。在System.IO.__Error。WinIOError(Int32 errorCode, String maybeFullPath)在System.IO.FileStream。Init(字符串路径,FileMode模式,FileAccess访问,Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptionsSECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)在System.IO.FileStream . .字符串路径,FileMode模式,FileAccess访问;文件共享,Int32 bufferSize)在System.Xml.XmlDownloadManager。GetStream(Uri Uri, iccredential凭证)IWebProxy proxy, RequestCachePolicy cachePolicy在System.Xml.XmlUrlResolver。gettenentity (Uri绝对Uri,字符串角色,o类型)bjectToReturn)在System.Xml.XmlTextReaderImpl。xmlResolver OpenUrlDelegate(对象)在System.Threading.CompressedStack.runTryCode(对象userData)在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl对象userData(对象userData)在System.Threading.CompressedStack。运行(CompressedStack) CompressedStack, ContextCallback(对象状态)在System.Xml.XmlTextReaderImpl.OpenUrl ()在System.Xml.XmlTextReaderImpl.Read ()。在System.Xml.XmlLoader。加载(XmlDocument文档,XmlReader阅读器,布尔格式)veWhitespace)在System.Xml.XmlDocument。XmlReader负载(读者)在System.Xml.XmlDocument。负载(String文件名)在GSelInterface.Program。转换(对象源,文件系统事件参数f)在C:'文档和设置'Administrator'Desktop'ConsoleApplication1'ConsoleApplication1 ' Program.cs: 178行
在try块中您已经打开了文件。你需要关闭它。
XmlDocument xdoc = new XmlDocument();
xdoc.Load(FileName);
按照这个例子。
http://msdn.microsoft.com/en-us/library/zcsyk915.aspx这可能是因为监视程序(然后是FileShare。读写是重要的部分)。
试题:
XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);
您正在尝试写入在try块中已经打开的"Filename"文件。
编辑1:似乎锁是由保存文件的进程设置的。当convert()被触发时,文件系统还没有完成保存文件的工作。如果你有一个很大的xml文件,这种情况尤其会发生。如果在写文件之前添加一个sleep,则不会引发异常。
这是一个快速&dirty补丁。
如果保存xml文件的频率很高,则需要为更改的xml文件添加某种锁。
编辑2:尝试在做事情之前删除观察者的事件,并在所有事情完成后再次添加,这样可以防止多个事件被触发。不确定EnableRaisingEvents = false是否能以正确的方式工作。请参阅这篇文章
EnableRaisingEvents(启用和禁用)
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());
}
这个问题的解决方案就在这个链接:
xml处理异常
这是我提出的另一个问题。谢谢大家花时间帮助我。确认该文件不存在
我必须重新创建我的构建配置,而旧文件仍然存在。一旦我删除了旧的转换,我就可以重新创建新的转换了。