FileSystemWatcher имеет странное поведение - PullRequest
4 голосов
/ 08 июля 2011

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

. Теперь становится странно: FileSystemWatcher никогда не запускает Changed -Event, когда я просто запускаю программу.Несмотря на то, что файл журнала действительно изменился.Но когда я открываю каталог в проводнике Windows, где находится файл журнала, программа работает, как ожидалось.Но только до тех пор, пока окно обозревателя остается открытым ... что за ..?

Операционная система: Windows Server 2008 R2

РЕДАКТИРОВАТЬ: Извините, вот код:

class Program
{
    static void Main(string[] args)
    {
        new LogFileWatcher(@"C:\PBX\Dial.log");
        System.Console.Read();
    }
}

public class LogFileWatcher
{
    public string LogFilePath { get; private set; }

    private DateTime _lastLogFileWriteTime;

    public LogFileWatcher(string path)
    {
        LogFilePath = path;
        var directoryName = Path.GetDirectoryName(LogFilePath);
        var fileName = Path.GetFileName(LogFilePath);

        var fsw = new FileSystemWatcher { Path = directoryName, Filter = fileName };
        fsw.Changed += fsw_Changed;
        fsw.EnableRaisingEvents = true;
    }

    private void fsw_Changed(object sender, FileSystemEventArgs e)
    {
        // Get and fix the last write time of the log file
        var fixLastWriteTime = File.GetLastWriteTime(LogFilePath);

        // Don't do anything when file didn't change since last time
        if (fixLastWriteTime == _lastLogFileWriteTime) return;

        Console.WriteLine("File changed on: {0} - ID:{1}", DateTime.Now.ToLongTimeString(), Guid.NewGuid());

        // Save last write time of the log file
        _lastLogFileWriteTime = fixLastWriteTime;
    }
}

EDIT2: Может быть, это важно: файл журнала используется Windows-Service УАТС!Я могу открыть его с помощью Блокнота.

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Прочитайте http://blogs.msdn.com/b/alejacma/archive/2011/03/23/filesystemwatcher-class-does-not-fire-change-events-when-notifyfilters-size-is-used.aspx для объяснения. Может быть, ваш случай такой же. Событие FW Changed не будет запущено, пока дескриптор файла не будет закрыт. Таким образом, пока WindowsService не закроет файл, вы в значительной степени застряли.

0 голосов
/ 12 июля 2011

По причинам оптимизации метод FileStream.Flush () - больше не сбрасывает метаданные (операционные системы Vista и более поздние версии Microsoft).Поэтому FileSystemWatcher не получает уведомления о файле и не запускает измененный метод.

http://connect.microsoft.com/VisualStudio/feedback/details/94772/filestream-flush-does-not-flush-the-file-in-the-correct-way-to-work-with-filesystemwatcher-or-native-readdirectorychangesw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...