C # File Monitoring - PullRequest
       4

C # File Monitoring

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

Это относится к предыдущему вопросу, который я задал.Я пытался создать приложение, которое позволит мне отслеживать файл и предупреждать меня, если файл перестал изменяться.Кто-то рекомендовал просто проверить размер файла и использовать таймер в службе Windows.Я воспользовался их советом, но не очень хорошо разбираюсь в службах Windows.Я пытаюсь сделать сравнение файлов между двумя файлами, которые я создал.Ниже приведен код

public partial class Service1 : ServiceBase
{
    Timer timer1 = new Timer();
    string filePath = @"C:\Users\Test\Desktop\New folder\Test.txt";
    string logPath = @"C:\Users\Test\Desktop\New folder\Log.txt";
    string newLog = @"C:\Users\Test\Desktop\New folder\Log1.txt";


    public Service1()
    {
        InitializeComponent();
    }

    public void OnStart(string[] args)
    {            
        timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
        timer1.Interval = 60000;
        timer1.Enabled = true;
        timer1.AutoReset = true;
        timer1.Start();

        FileInfo f = new FileInfo(filePath);
        long s1 = f.Length;

        using (StreamWriter file = new StreamWriter(logPath))
        {
            file.WriteLine(s1.ToString());
        }
    }

    protected override void OnStop()
    {
        timer1.Enabled = false;
    }

    public void timer1_Elapsed(object sender, ElapsedEventArgs e)
    {
        FileInfo f = new FileInfo(filePath);
        long s2 = f.Length;

        using (StreamWriter file = new StreamWriter(newLog))
        {
            file.WriteLine(s2.ToString());
        }
    }
}

Не могу понять, как ссылаться на s1 в методе timer_elapsed.Я пытался объявить это глобально, но это не сработало.Я хочу просто иметь возможность сделать что-то подобное в методе истекшего таймера.

        if (s1 == s2)
        {
            //send email
        }

        else
        {
            //don't do anything
        }

Любой совет будет высоко ценится.

Ответы [ 2 ]

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

просто сделайте это так:

public partial class Service1 : ServiceBase
{
    Timer timer1 = new Timer();
    string filePath = @"C:\Users\Test\Desktop\New folder\Test.txt";
    string logPath = @"C:\Users\Test\Desktop\New folder\Log.txt";
    string newLog = @"C:\Users\Test\Desktop\New folder\Log1.txt";
    long oldFileSize; // Add this line

    public void OnStart(string[] args)
    {            
        timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
        timer1.Interval = 60000;
        timer1.Enabled = true;
        timer1.AutoReset = true;
        timer1.Start();

        FileInfo f = new FileInfo(filePath);
        oldFileSize = f.Length; // change this line

        using (StreamWriter file = new StreamWriter(logPath))
        {
            file.WriteLine(s1.ToString());
        }
    }

    public void timer1_Elapsed(object sender, ElapsedEventArgs e)
    {
        FileInfo f = new FileInfo(filePath);
        long s2 = f.Length;

        using (StreamWriter file = new StreamWriter(newLog))
        {
            if (s2 == oldFileSize)
            {
                // Send Email
            }
            file.WriteLine(s2.ToString());
        }
    }
2 голосов
/ 09 июля 2011

Вам нужен класс FileSystemWatcher.Есть настройки для NotifyFilter / Path / IncludeSubdirectories.

Также этот класс вызывает множество событий для Изменено, Создано, Удалено, Переименовано.

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

...