【问题标题】:Deleting file in event raised by Filesystemwatcher在 Filesystemwatcher 引发的事件中删除文件
【发布时间】:2011-11-17 13:34:11
【问题描述】:

我正在使用FileSystemWatcher 监视文件夹并删除在该文件夹下创建的文件。但是我的应用程序抛出了一个异常:

文件正被另一个应用程序使用

ifsXmlFileWatcher.Path = "D:\\";
ifsXmlFileWatcher.IncludeSubdirectories = false;
ifsXmlFileWatcher.EnableRaisingEvents = true;
ifsXmlFileWatcher.Created += new FileSystemEventHandler(IfsFileUpload); 

private void IfsFileUpload(object sender, System.IO.FileSystemEventArgs e)
{
    try
    {            
        {               
            File.Delete(e.FullPath);
        }
    }
    catch (Exception exp)
    {
        MessageBox.Show(exp.Message);
    }
}

可能是什么问题?

【问题讨论】:

  • 问题是由某个程序创建的文件仍在被该程序使用并具有排他锁。

标签: c# windows-services filesystemwatcher


【解决方案1】:

我猜这是时间问题。 FileSystemWatcher 在创建文件时立即触发它的 Created 事件。这并不意味着所有内容都写入文件并再次关闭。所以它只是被创建它的进程访问,因为这个进程还没有完成对它的写入。

要删除它,您必须等到写入完成。

【讨论】:

    【解决方案2】:

    您所知道的问题“文件正在被另一个应用程序使用”。 因此,它可能是您自己的应用程序使用它,也可能是您环境中使用它的其他应用程序。 可能的解决方案是 您可以继续尝试删除它一定次数,我在这里尝试 5 次,然后在某处放弃/写入事件或显示消息。我在这里发布了类似的答案,有人需要确保复制的文件成功How to know that File.Copy succeeded?

    private void IfsFileUpload(object sender, System.IO.FileSystemEventArgs e)
    {
      bool done = false;
      string file = e.FullPath;
    
      int i = 0;
    
      while (i < 5)
      {
        try
        {
    
          System.IO.File.Delete(file);
          i = 5;
          done = true;
        }
        catch (Exception exp)
        {
          System.Diagnostics.Trace.WriteLine("File trouble " + exp.Message);
          System.Threading.Thread.Sleep(1000);
          i++;
        }
    
      }
      if (!done)
        MessageBox.Show("Failed to delte file " + file);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多