Как я могу узнать, изменился ли файл через .NET? - PullRequest
1 голос
/ 26 января 2009

Я ищу способ определить, когда конкретный файл изменился, через .NET. (В конечном итоге мне нужна функциональность, которая создает копию файла сразу после его изменения.) Как это можно сделать?

Ответы [ 6 ]

11 голосов
/ 26 января 2009

Вы можете использовать объект FileSystemWatcher. Это вызывает события при изменении файлов в указанной просматриваемой папке.

5 голосов
/ 26 января 2009
class Program
    {
        static void Main(string[] args)
        {
            FileSystemWatcher fsw = new FileSystemWatcher(@"c:\temp");
            fsw.Changed += new FileSystemEventHandler(fsw_Changed);
            fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
            fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
            fsw.Created += new FileSystemEventHandler(fsw_Created);
            fsw.EnableRaisingEvents = true;
            Console.ReadLine();
        }

        static void fsw_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was created", e.FullPath);
        }

        static void fsw_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("{0} was Renamed", e.FullPath);
        }

        static void fsw_Deleted(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was Deleted", e.FullPath);
        }

        static void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was Changed", e.FullPath);
        }
}
3 голосов
/ 26 января 2009

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

Обязательно прочтите также документы по FileSystemWatcher Class , особенно раздел о событиях и размерах буфера.

3 голосов
/ 26 января 2009

Microsoft Windows и ее предок MS-DOS всегда имели в своих файлах атрибут, который указывает, был ли этот файл изменен с момента последней очистки этого атрибута, что-то вроде «грязного флага». В прошлом он использовался программами резервного копирования, чтобы находить те файлы, для которых нужно было выполнить поэтапное резервное копирование, а затем очищался при создании копии этого файла.

Вы можете использовать File.GetAttributes, чтобы получить атрибуты в файле, и использовать File.SetAttributes, чтобы очистить этот атрибут «Архив». В следующий раз, когда этот файл будет открыт для записи, этот архив будет снова установлен.

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

1 голос
/ 14 мая 2009

Вы, вероятно, столкнетесь с проблемами с FileSystemWatcher (не получая события, слишком много событий и т. Д.). Этот код завершает и решает многие из них: http://precisionsoftware.blogspot.com/2009/05/filesystemwatcher-done-right.html

0 голосов
/ 15 ноября 2013

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

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