Мониторинг изменений каталога
-
02-07-2019 - |
Вопрос
Я создаю приложение на C #, которое будет отслеживать указанный каталог на предмет изменений и дополнений и сохранять информацию в базе данных.
Я бы хотел избежать проверки каждого отдельного файла на наличие изменений, но я не уверен, могу ли я полностью доверять времени доступа к файлу.
Какой метод лучше всего использовать для получения недавно измененных файлов в каталоге?
Он будет проверять наличие изменений только тогда, когда пользователь попросит его об этом, это не будет постоянно работающий сервис.
Решение
Хм...интересный вопрос.Изначально я бы указал вам на Просмотр файловой системы класс.Однако, если вы собираетесь заставить это работать по запросу пользователя, то, возможно, вам потребуется изначально сохранить информацию о каталоге, а затем сравнивать каждый раз, когда пользователь запрашивает.Я бы, вероятно, использовал FileSystemWatcher и все равно просто сохранил ваши результаты.
Другие советы
Используйте объект FileSystemWatcher.Вот некоторый код, чтобы сделать то, что вы ищете.
// Declares the FileSystemWatcher object FileSystemWatcher watcher = new FileSystemWatcher(); // We have to specify the path which has to monitor watcher.Path = @"\\somefilepath"; // This property specifies which are the events to be monitored watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | notifyFilters.DirectoryName; watcher.Filter = "*.*"; // Only watch text files. // Add event handlers for specific change events... watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Begin watching. watcher.EnableRaisingEvents = true; // Define the event handlers. private static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. } private static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. }
Я думаю, то, что вы хотите, обеспечивается Просмотр файловой системы класс.
В этом руководстве описано, как использовать его для отслеживания изменений каталога в простой службе Windows; Как реализовать простую службу Windows filewatcher на C#
Если вам это нужно только для проверки, когда пользователь запрашивает, а не постоянно, не используйте FileSystemWatcher.Особенно, если это общий ресурс - последнее, что вам нужно, это 50 клиентских компьютеров, просматривающих один и тот же общий каталог.
Вероятно, это просто опечатка, но вы не должны смотреть на время доступа к файлу, вы хотите посмотреть на время модификации файла, чтобы получить изменения.Даже на это нельзя положиться.
Что я бы сделал, так это реализовал какую-то функцию контрольной суммы для даты файла и размера в байтах или других свойств файловой системы.Таким образом, я бы не искал изменения во всем файле - только в его свойствах, и я могу сделать это по запросу, вместо того, чтобы пытаться поддерживать соединение с удаленным ресурсом для его мониторинга.
Более сложным решением было бы сделать это наоборот и установить службу на компьютере, на котором размещен общий диск, которая могла бы отслеживать файлы и отмечать изменения.Тогда вы могли бы запросить сервис, а не прикасаться к файлам вообще - но это, вероятно, излишне.