Отслеживать файл на предмет изменений - PullRequest
2 голосов
/ 08 июля 2011

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

У кого-нибудь есть идеи?Я поиграл с классом FileSystemWatcher в C #, но я не знаю, есть ли способ использовать для предупреждения, когда файл не изменяется, так как все события смотрят на изменения.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 08 июля 2011

Просто используйте таймер, который срабатывает с интервалом, в течение которого этот файл должен быть обновлен.

Проверьте размер файла (FileInfo.Length) и совпадает ли он с последнимВремя срабатывания таймера не растет.

2 голосов
/ 08 июля 2011

Файл не меняется большую часть времени. Вам необходимо определить период времени, после которого процесс регистрации считается остановленным. Запустите таймер, который (когда он завершится) будет сигнализировать, что регистрация остановлена. Сбрасывайте таймер каждый раз, когда появляется событие изменения.

2 голосов
/ 08 июля 2011

В этом случае вам не нужен наблюдатель, вы можете использовать таймер.Каждые несколько минут (или в зависимости от ваших потребностей) проверяйте размер файла.Храните последний размер где-нибудь.При следующей проверке сравните предыдущее значение с текущим.Если они совпадают, то файл не изменился, и вы можете выдать предупреждение.

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

Вы можете использовать FileSytemWatcher класс:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

обновление: хорошо, стоит прочитать вопрос до конца ... Вы можете установить Timer ( ref ) на время бездействия, о котором вы хотите получать оповещения, и сбросить таймер FileSystemWatcher событий.

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

Я предлагаю вам объединить все ответы, которые вы уже получили.

Используйте класс FileSytemWatcher для отслеживания изменений и использования таймера для ожидания некоторого периода времени с момента последнего изменения .

Самое простое решение будет выглядеть как переменные ManualResetEvent и DateTime (не забывайте о барьерах памяти) и фоновый поток.

Итак, вы получите что-то вроде этого:

DateTime _lastChangeTime;
ManualResetEvent _exitEvent; // set this event to exit thread.

private void Watcher_Change(...)
{
    _lastChangeTime = DateTime.UtcNow;
    Thread.MemoryBarrier();
}


private void ThreadProc()
{
    while (_exitEvent.Wait(1000)) // every second
    {
        Thread.MemoryBarrier();

        if (DateTime.UtcNow.Subtract(lastChangeTime) > [some reasonable time])
        {
            // shit happens...
        }
    }
}
...