我遇到了一个例外:进程无法访问该文件。
代码如下:
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>");
}
}
这里可能出了什么问题?
编辑:我得到的错误
进程失败:系统。IO。IOException:进程无法访问文件“z:\TF\u B1BBA”。因为它正被另一个进程使用。at系统。IO__错误系统中的WinIOError(Int32 errorCode,字符串maybeFullPath)。IO。文件流。系统初始化(字符串路径、文件模式模式、文件访问访问、I nt32权限、布尔用户权限、文件共享、Int32缓冲区大小、文件选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、Boolean useLongPath)。IO。文件流。。系统中的ctor(字符串路径、文件模式、文件访问访问、文件共享、Int32 bufferSize)。Xml。XmlDownloadManager。系统中的GetStream(Uri Uri、ICredentials凭据、IWebProxy代理、RequestCachePolicy cachePolicy)。Xml。XmlUrlResolver。系统中的GetEntity(Uri绝对Uri、字符串角色、对象返回的类型)。Xml。XmlTextReaderImpl。系统中的OpenUrlDelegate(对象xmlResolver)。穿线。压缩堆栈。在系统上运行trycode(对象用户数据)。运行时。编译器服务。运行时助手。在系统上执行ECodeWithGuaranteedCL eanup(TryCode代码、CleanupCode backoutCode、Object userData)。穿线。压缩堆栈。在系统上运行(CompressedStack CompressedStack,Cont extCallback callback,Object state)。Xml。XmlTextReaderImpl。系统中的OpenUrl()。Xml。XmlTextReaderImpl。读取()。at系统。Xml。XmlLoader。在系统中加载(XmlDocument doc、XmlReader reader、Boolean prese veWhitespace)。Xml。XML文档。在系统上加载(XmlReader reader)。Xml。XML文档。在GSelInterface加载(字符串文件名)。程序在C:\Documents and Settings\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Program中转换(对象源、文件系统目标f)。cs:178号线
您正在尝试写入已在try块中打开的“Filename”文件。
编辑1:
锁似乎是由保存文件的进程设置的。启动convert()时,文件系统仍未完成文件的保存。如果您有一个大的xml,这种情况尤其会发生。如果您在尝试写入文件之前添加睡眠,则不会引发异常。
这是一个快速
如果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());
}
可能是因为观察者(然后是FileShare. ReadWrit是重要的部分)。
尝试:
XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);
在try块中,您已打开文件。您需要关闭它。
XmlDocument xdoc = new XmlDocument();
xdoc.Load(FileName);
遵循此示例。
http://msdn.microsoft.com/en-us/library/zcsyk915.aspx
我在ubuntu服务器上运行selenium测试用例,该服务器基本上在firefox和chrome中运行测试用例。Firefox启动并成功运行测试用例,但chrome引发异常: *****下面是stacktrace的片段:***** 在端口21549上启动ChromeDriver(v2.8.240825) 禁用PAC支持,因为没有系统实现 测试集成。AdminUserelementscheck失败
我刚使用System.io,我不明白为什么我的代码会导致这个异常。我想检查一个目录和一个文件是否存在,如果不存在,我想创建它们。之后,我想在我刚创建的文件上写点东西。在这里它抛出异常。我非常确信,当im试图使用StreamWriter时,创建会导致异常,因为如果该文件已经存在,我不会得到一个执行。此外,当我在一次尝试失败后再次单击调用此funktion的按钮时,没有任何例外,并且一切都运行良好(看
我正在尝试使用selenium(2.53.1)和pom作为浏览器启动Chrome(版本58.0.3029.110(64位)) 代码: 我在Eclipse控制台中得到以下异常 D: \eclipse\QA\u Code\u Git\u Gerrit\TA-PAY\api automation\lib\chromedriver。exe在端口38042上启动ChromeDriver 2.29.46159
我有一个带有以下代码的p12文件上传功能: 然后我想创建一个函数来删除p12文件,代码如下: 当我运行结果时,出现了一个错误: 有没有办法成功删除文件? 更新:我发现了这个问题,显然是因为这个函数中使用了p12文件: 有没有办法删除p12文件?
运行在wince 5.0/.NET framework compact 2.0上的代码 总是会得到一个异常: 另外:我只想更新文件,读写。还有更好的办法吗?
进程无法访问文件“f:\copy backup\system\hrm 2-5-2013\hrm\hrm\lanbased.txt”,因为另一个进程正在使用该文件。这是我在sub main中的代码 这是我的表单CREATE中的代码。当另一个进程正在使用该文件时,我如何访问该文件?