Метод C # FileSystemWatcher WaitForChanged обнаруживает только одно изменение файла - PullRequest
1 голос
/ 09 декабря 2011

У меня возникла проблема, похожая на эту: FileSystemWatcher - только событие изменения один раз запускается?

Но так как этому потоку два года, и мой код немного другойЯ решил открыть новый вопрос.

Вот мой код:

while (true)
{
  FileSystemWatcher fw = new FileSystemWatcher();

  fw.Path = @"Z:\";
  fw.Filter = "*.ini";
  fw.WaitForChanged(WatcherChangeTypes.All);
  Console.WriteLine("File changed, starting script...");
  //if cleanup
  try
  {
      if (File.ReadAllLines(@"Z:\file.ini")[2] == "cleanup")
      {
          Console.WriteLine("Cleaning up...");
          Process c = new Process();
          c.StartInfo.FileName = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop).Trim('\\') + @"\clean.exe";
          c.StartInfo.WorkingDirectory = System.Environment.SpecialFolder.DesktopDirectory.ToString();
          c.Start();
          c.WaitForExit();
          Console.WriteLine("Done with cleaning up, now starting script...");
      }
  }
  catch
  {
      Console.WriteLine("No cleanup parameter found.");
  }
  Process p = new Process();
  p.StartInfo.FileName = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop).Trim('\\') + @"\go.exe";
  p.StartInfo.WorkingDirectory = System.Environment.SpecialFolder.DesktopDirectory.ToString();
  p.Start();
  Console.WriteLine("Script running...");
  p.WaitForExit();
  fw = null;
  Console.WriteLine("Done. Waiting for next filechange...");
}

Проблема: эта программа должна обнаружить изменение файла в файле "Z: \ file.ini".Если он изменился, скрипт должен быть запущен.Когда сценарий завершен, программа должна вернуться к началу и снова начать наблюдать за изменениями (поэтому я использовал цикл while).Ну, первое изменение обнаружено, и все, кажется, работает просто отлично, но любые изменения ПОСЛЕ первого не будут обнаружены.Я пытался установить для объекта FileSystemWatcher значение null, как вы можете видеть, но это не помогло.

Итак, я надеюсь на хорошие ответы.Спасибо.

1 Ответ

3 голосов
/ 09 декабря 2011

Я бы изменил ваш дизайн, чтобы вы не полагались на FileSystemWatcher для каких-либо изменений. Вместо этого опросите каталог или файл, который вы просматриваете, на предмет каких-либо изменений. Затем вы можете использовать FileSystemWatcher вместе с этим, чтобы разбудить его как можно скорее, если мы знаем, что есть изменения. Таким образом, если вы пропустите событие, вы все равно восстановитесь после него, основываясь на тайм-ауте опроса.

, например

static void Main(string[] args)
{
    FileSystemWatcher watcher = new FileSystemWatcher(@"f:\");
    ManualResetEvent workToDo = new ManualResetEvent(false);
    watcher.NotifyFilter = NotifyFilters.LastWrite;
    watcher.Changed += (source, e) => { workToDo.Set(); };
    watcher.Created += (source, e) => { workToDo.Set(); };

    // begin watching
    watcher.EnableRaisingEvents = true;

    while (true)
    {
        if (workToDo.WaitOne())
        {
            workToDo.Reset();
            Console.WriteLine("Woken up, something has changed.");
        }
        else
            Console.WriteLine("Timed-out, check if there is any file changed anyway, in case we missed a signal");

        foreach (var file in Directory.EnumerateFiles(@"f:\")) 
            Console.WriteLine("Do your work here");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...