Удаление файла в событии, вызванном Filesystemwatcher - PullRequest
0 голосов
/ 17 ноября 2011

Я отслеживаю папку с помощью 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);
    }
}

В чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Я думаю, это проблема времени.FileSystemWatcher запускает событие Created сразу же после создания файла.Это не означает, что весь контент записывается в файл и снова закрывается.Так что к нему обратился только тот, кто его создал, потому что этот процесс еще не завершил запись в него.

Чтобы удалить его, нужно дождаться окончания записи.

0 голосов
/ 17 ноября 2011

Проблема, как вы знаете, "Файл используется другим приложением".Так что это может быть ваше собственное приложение, использующее его, или другое приложение в вашей среде, использующее его. Возможное решение может быть Вы можете пытаться удалить его определенное количество раз, я пробую здесь как 5 раз, а затем где-нибудь бросить / записать событие или показать сообщение.Я разместил аналогичный ответ здесь, где кто-то должен убедиться, что скопированный файл успешен Как узнать, что File.Copy успешно?

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);

}
...