2008-09-21 2 views
6

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

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

Каким будет лучший метод для получения недавно измененных файлов в каталоге?

Он будет проверять изменения только тогда, когда пользователь запросит его, это не будет постоянно работающий сервис.

+0

У вас есть всегда работающий сервис или вы хотите, чтобы программа извлекала недавно измененные файлы при каждом запуске без постоянного мониторинга файловой системы? Пожалуйста, уточните этот вопрос. – 2008-09-21 21:52:50

ответ

1

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

6

Используйте объект 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. 
    } 
1

Если вам нужно только это проверить, когда пользователь запрашивает, а затем все время, не используйте FileSystemWatcher. Особенно, если это общий ресурс - последнее, что вы хотите, - это 50 клиентских машин, просматривающих один и тот же общий каталог.

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

Что бы я сделал, это реализовать какую-либо функцию контрольной суммы для даты файла и размера байта или других свойств файловой системы. Таким образом, я бы не искал изменений в полном файле - только его свойства, и я могу сделать это по запросу, вместо того, чтобы пытаться провести подключение к удаленному ресурсу для его мониторинга.

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

Смежные вопросы