C# FileSystemWatcher出现文件访问错误
我正在使用文件监视程序(.NET),并且总是出现以下错误- 文件正在被另一个进程使用 上述错误仅出现在网络共享中,即共享了Watch目录,如果有人将文件放入该目录,则只会发生此错误。当我将文件从我的m/c放到监视目录(本地)时,它工作得很好 下面的代码就是这样的,错误出现在第一行。我已经尝试了网上给出的所有解决方案,但似乎没有任何效果。当我放入Thread.Sleep(500)时,唯一的解决方案是有效的,但在此之后,它无法选择下一个文件。任何建议都会大有帮助C# FileSystemWatcher出现文件访问错误,c#,.net,service,file-io,C#,.net,Service,File Io,我正在使用文件监视程序(.NET),并且总是出现以下错误- 文件正在被另一个进程使用 上述错误仅出现在网络共享中,即共享了Watch目录,如果有人将文件放入该目录,则只会发生此错误。当我将文件从我的m/c放到监视目录(本地)时,它工作得很好 下面的代码就是这样的,错误出现在第一行。我已经尝试了网上给出的所有解决方案,但似乎没有任何效果。当我放入Thread.Sleep(500)时,唯一的解决方案是有效的,但在此之后,它无法选择下一个文件。任何建议都会大有帮助 try
try
{
using (Stream stream = File.Open(xmlPath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
XmlTextReader xmlTextReader = new XmlTextReader(stream);
document = XDocument.Load(xmlTextReader);
........ // my code
xmlTextReader.Close();
stream.Close();
}
}
catch (Exception exception)
{
EventLog.WriteEntry("Application", exception.ToString(), EventLogEntryType.Error);
}
我想你会发现这个文件是不可访问的,因此等待是有效的 看看这段代码,看看这是否有帮助
// Consider having a List<String> named _changedFiles
private void OnChanged(object source, FileSystemEventArgs e)
{
lock (_changedFiles)
{
if (_changedFiles.Contains(e.FullPath))
{
return;
}
}
// do your stuff
System.Timers.Timer timer = new Timer(1000) { AutoReset = false };
timer.Elapsed += (timerElapsedSender, timerElapsedArgs) =>
{
lock (_changedFiles)
{
_changedFiles.Remove(e.FullPath);
}
};
timer.Start();
}
<代码> //考虑有一个名为“ychange文件”的列表
私有void OnChanged(对象源、文件系统目标)
{
锁定(_changedFiles)
{
if(_changedFiles.Contains(例如FullPath))
{
返回;
}
}
//做你的事
System.Timers.Timer Timer=新计时器(1000){AutoReset=false};
timer.appeased+=(TimeRecursedSender,TimeRecursedDargs)=>
{
锁定(_changedFiles)
{
_更改文件。删除(例如,完整路径);
}
};
timer.Start();
}
发件人:
stream.close()在您的代码中是多余的。使用将为you@CodeIgnoto是对的,,另外,
XmlTextReader
实现了IDisposable
,因此您也可以使用将其封装在中。@CodeIgnoto-是的,我知道我已经删除了该代码。是的,但即使我删除了这些行,错误仍然会出现。@Punit该建议与回答您的问题无关,更多的是关于日常管理。老实说,答案是“文件正被另一个进程使用”——要么有人仍然打开该文件,要么有应用程序打开了该文件。@Mathew-希望这也适用于OnCreate,您在哪里将文件名添加到列表中,并且我正在将EnableRaisingEvents设置为true,是否可以?您好,应该设置为true。请看一个微软的例子,它实际上非常清楚。它应该适用于oncreate或任何事件。基本上,您只需要延迟文件访问,直到可以锁定需要打开的文件。我认为这是问题的根本原因。无论如何,我希望这有助于澄清问题,并为您提供解决方案?问候马修·齐隆卡(很好,很高兴我能帮忙:)