Как я могу отслеживать каталог Windows на предмет изменений? - PullRequest
32 голосов
/ 17 апреля 2009

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

Есть ли какой-нибудь способ выполнения программы при изменении?

Я не программист на C / C ++ /. NET, поэтому, если бы я мог что-то настроить, чтобы изменение могло инициировать пакетный файл, тогда это было бы идеально.

Ответы [ 7 ]

25 голосов
/ 17 апреля 2009

Используйте FileSystemWatcher , как показано ниже, для создания события WatcherCreated ().

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

    // Declare a new FILESYSTEMWATCHER
    protected FileSystemWatcher watcher;
    string pathToFolder = @"YourDesired Path Here";

    // Initialize the New FILESYSTEMWATCHER
    watcher = new FileSystemWatcher {Path = pathToFolder, IncludeSubdirectories = true, Filter = "*.*"};
    watcher.EnableRaisingEvents = true;
    watcher.Created += new FileSystemEventHandler(WatcherCreated);

    void WatcherCreated(object source , FileSystemEventArgs e)
    {
      //Code goes here for when a new file is detected
    }
8 голосов
/ 13 ноября 2012

FileSystemWatcher - правильный ответ, за исключением того, что раньше FileSystemWatcher работал только для «нескольких» изменений одновременно. Это было из-за буфера операционной системы. На практике, когда копируется много небольших файлов, буфер, содержащий имена файлов, которые были изменены, переполняется. Этот буфер на самом деле не является правильным способом отслеживания последних изменений, так как ОС должна была бы прекратить запись, когда буфер заполнен, чтобы предотвратить переполнение.

Вместо этого Microsoft предоставляет другие средства (РЕДАКТИРОВАТЬ: например, журналы изменений), чтобы действительно фиксировать все изменения. По сути, это средства, которые используют системы резервного копирования, и они сложны в отношении событий, которые записываются. И также плохо документированы.

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

6 голосов
/ 17 апреля 2009

Если вы хотите что-то непрограммное, попробуйте GiPo @ FileUtilities ... но в этом случае вопрос не будет здесь!

3 голосов
/ 16 декабря 2014

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

using System;
using System.IO;

namespace Folderwatch
{
    class Program
    {
        static void Main(string[] args)
        {

            //Based on /654510/kak-ya-mogu-otslezhivat-katalog-windows-na-predmet-izmenenii
            //and http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

            string pathToFolder = string.Empty;
            string filterPath = string.Empty;
            const string USAGE = "USAGE: Folderwatch.exe PATH FILTER \n\n e.g.:\n\n Folderwatch.exe c:\\windows *.dll";

            try
            {
                pathToFolder = args[0];

            }
            catch (Exception)
            {
                Console.WriteLine("Invalid path!");
                Console.WriteLine(USAGE);
                return;
            }

            try
            {
                filterPath = args[1];
            }
            catch (Exception)
            {
                Console.WriteLine("Invalid filter!");
                Console.WriteLine(USAGE);
                return;

            }

            FileSystemWatcher watcher = new FileSystemWatcher();

            watcher.Path = pathToFolder;
            watcher.Filter = filterPath;

            watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | 
                NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | 
                NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;

            // Add event handlers.
            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;

            // Wait for the user to quit the program.
            Console.WriteLine("Monitoring File System Activity on {0}.", pathToFolder);
            Console.WriteLine("Press \'q\' to quit the sample.");
            while (Console.Read() != 'q') ;

        }

        // Define the event handlers. 
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            // Specify what is done when a file is changed, created, or deleted.
            Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        }

        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            // Specify what is done when a file is renamed.
            Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
        }
    }
}

Чтобы использовать это, загрузите Visual Studio (Express сделает). Создайте новое консольное приложение C # с именем Folderwatch, скопируйте и вставьте мой код в ваш Program.cs.

В качестве альтернативы вы можете использовать Sys Internals Process Monitor: Process Monitor Он может контролировать файловую систему и многое другое.

3 голосов
/ 17 апреля 2009

Использовать FileSystemWatcher

2 голосов
/ 17 апреля 2009

Нет утилиты или программы, поставляемой с Windows, чтобы сделать это. Требуется некоторое программирование.

Как отмечается в другом ответе, .NET FileSystemWatcher - самый простой подход.

Собственный API ReadDirectoryChangesW довольно сложен в использовании (требует понимания портов завершения).

1 голос
/ 07 октября 2014

Этот вопрос очень помог мне понять систему File Watcher. Я реализовал ReadDirectoryChangesW для мониторинга каталога и всех его подкаталогов и получения информации об изменениях в этих каталогах.

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

Win32 File Watcher Api для мониторинга изменений каталога .

...