【发布时间】:2013-03-26 12:29:42
【问题描述】:
我遇到了一个异常:进程无法访问该文件。
代码如下:
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 错误代码,字符串可能全路径) 在 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 使用长路径) 在 System.IO.FileStream..ctor(字符串路径,FileMode 模式,FileAccess 访问, FileShare 共享,Int32 bufferSize) 在 System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials 凭据, IWebProxy 代理,RequestCachePolicy 缓存策略) 在 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,字符串角色,O 类型 对象返回) 在 System.Xml.XmlTextReaderImpl.OpenUrlDelegate(对象 xmlResolver) 在 System.Threading.CompressedStack.runTryCode(对象 userData) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl eanup(TryCode 代码、CleanupCode backoutCode、对象 userData) 在 System.Threading.CompressedStack.Run(CompressedStack 压缩堆栈,续 extCallback 回调,对象状态) 在 System.Xml.XmlTextReaderImpl.OpenUrl() 在 System.Xml.XmlTextReaderImpl.Read() .在 System.Xml.XmlLoader.Load(XmlDocument 文档,XmlReader 阅读器,布尔预置 ve空白) 在 System.Xml.XmlDocument.Load(XmlReader 阅读器) 在 System.Xml.XmlDocument.Load(字符串文件名) 在 C:\ 中的 GSelInterface.Program.convert(Object source, FileSystemEventArgs f) 文档和设置\Administrator\Desktop\ConsoleApplication1\ConsoleApplic ion1\Program.cs:第 178 行
【问题讨论】:
-
lockobject 和/或 watcher 对象是否以某种方式在同一个文件上工作?它们可能是文件锁定的原因
-
是的,我有监视对象监视该文件夹。在它拾取它之后,我将它的观察者设置为 false,然后通过它来验证 xml 是否完美(如第二个代码中所示),然后应用 xml 转换。但是在我做这一切之前我确实把观察者设置为假,所以它干扰文件处理的可能性很小甚至没有。也许我错了。帮助我理解。
-
我尝试删除我在此处使用的线程的锁定对象,但错误仍然相同。
-
您添加的简单代码将起作用。我按原样尝试了它,即使我认为在 catch 块内做某事不是最佳实践,而且我没有收到文件错误。所以这是锁定文件以进行写入的其他东西,可能在您发布的剪辑之外
-
完整代码如下:pastebin.com/rFqZVB0H
标签: c# .net ioexception