FileSystemWatcher - только событие изменения, один раз выстрелив, один раз?

Я использую приведенный ниже код для прослушивания событий изменения файла, который я загружаю с сервера и открываю. однако событие изменения срабатывает только при первом сохранении файла, а затем при последующем сохранении средство просмотра файлов не запускает события изменения?

Кто-нибудь может увидеть, что происходит?

private FileSystemWatcher StartWatchingFile()
{
    fw = new FileSystemWatcher();
    fw.Path = this.directoryLocation;
    fw.Filter = this.Filename;

    fw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite;

    // Add event handler
    fw.Changed += new FileSystemEventHandler(fw_Changed);

    // Open file        
System.Diagnostics.Process.Start(this.CreateAbsoluteFilePath(this.Filename));

    // Begin watching.
    fw.EnableRaisingEvents = true;

    return fw;
}

//************************  

    void fw_Changed(object sender, FileSystemEventArgs e)
    {
        MessageBox.Show("File: " + e.FullPath + " " + e.ChangeType);
    }

РЕДАКТИРОВАТЬ: StartWatchingFile () теперь возвращает filewatcher, который хранится в классе, который не будет собирать мусор, просто чтобы убедиться, что я держу весь класс так, как думал, что функция fw_changed () может быть не в состоянии вызвать. Таким образом, весь класс теперь не собирает мусор. Класс хранится в ArrayList, который является открытым членом класса

С Уважением,

Джон

 Jon21 авг. 2009 г., 22:07
Это верно
 Paul Williams21 авг. 2009 г., 22:04
Размещенный вами код не перехватывает переименованные или удаленные события. Я так понимаю, файл не переименовывается или не удаляется?

Ответы на вопрос(2)

всегда работает в первый раз?

Если нет, тоFileSystemWatcher могли быть собраны сборщиком мусора в то же время послеStartWatchingFile закончил, потому что он объявлен локально.

Если это так, возможно, процесс, который вы запускаете, блокирует файл, чтобы файл фактически не был изменен?

 Jon21 авг. 2009 г., 22:42
Я только что обновил
 Ed S.21 авг. 2009 г., 22:43
Я не думаю, что он будет собран, так как обработчик событий является ссылкой на объект.
 Ed S.21 авг. 2009 г., 22:44
... Хотя это все равно должна быть переменная уровня класса.
 dtb21 авг. 2009 г., 22:33
Пожалуйста, обновите ваш вопрос, чтобы отразить изменения кода.
 Jon21 авг. 2009 г., 22:22
Теперь я держу весь класс в переменной другого класса, чтобы он не собирал мусор, а запускался только один раз. Я думаю, что вы правы в отношении файла, заблокированного приложением, которое его открывает, но почему средство отслеживания файлов срабатывает только при первом сохранении?
Решение Вопроса

я не могу ответить на ваш вопрос конкретно. В общем, я внесу свой вклад в то, что, если вы используете его достаточно, вы узнаете, что FileSystemWatcher не является надежным. Microsoft Connect показываетнесколько проблем с этим. я согласен сДжейсон Джексон берет FileSystemWatcher.

 lance21 авг. 2009 г., 23:25
Я не могу говорить со знанием дела о том, что другое программное обеспечение для редактирования имеет блокировку (или что-то еще) для файла, который нужно загрузить. Но, что касается «просмотра» файла на предмет изменений, я бы опросил файловую систему и сравнил то, что вы видели раньше (последняя измененная временная метка, размер файла, что угодно), с тем, что вы видите сейчас, и «загрузил на сервер», когда вы увидите изменение, которое вы искали. Это некрасиво, но надежно.
 Jon21 авг. 2009 г., 22:44
какой корень ты бы предложил? Сценарий заключается в том, что я загружаю файл с сервера, который пользователь может редактировать. После того, как пользователи закончили редактирование, измененный файл должен быть снова загружен на сервер без какого-либо участия пользователя. Пойманный пользователь может закрыть файл, но не программу, в которой он редактируется? Спасибо за ваш вклад.

Ваш ответ на вопрос