Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileSystemWatcher出现文件访问错误_C#_.net_Service_File Io - Fatal编程技术网

C# FileSystemWatcher出现文件访问错误

C# FileSystemWatcher出现文件访问错误,c#,.net,service,file-io,C#,.net,Service,File Io,我正在使用文件监视程序(.NET),并且总是出现以下错误- 文件正在被另一个进程使用 上述错误仅出现在网络共享中,即共享了Watch目录,如果有人将文件放入该目录,则只会发生此错误。当我将文件从我的m/c放到监视目录(本地)时,它工作得很好 下面的代码就是这样的,错误出现在第一行。我已经尝试了网上给出的所有解决方案,但似乎没有任何效果。当我放入Thread.Sleep(500)时,唯一的解决方案是有效的,但在此之后,它无法选择下一个文件。任何建议都会大有帮助 try

我正在使用文件监视程序(.NET),并且总是出现以下错误- 文件正在被另一个进程使用

上述错误仅出现在网络共享中,即共享了Watch目录,如果有人将文件放入该目录,则只会发生此错误。当我将文件从我的m/c放到监视目录(本地)时,它工作得很好

下面的代码就是这样的,错误出现在第一行。我已经尝试了网上给出的所有解决方案,但似乎没有任何效果。当我放入Thread.Sleep(500)时,唯一的解决方案是有效的,但在此之后,它无法选择下一个文件。任何建议都会大有帮助

      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或任何事件。基本上,您只需要延迟文件访问,直到可以锁定需要打开的文件。我认为这是问题的根本原因。无论如何,我希望这有助于澄清问题,并为您提供解决方案?问候马修·齐隆卡(很好,很高兴我能帮忙:)