Подтвердить что ты не робот

Как я могу контролировать каталог Windows для изменений?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Вместо этого Microsoft предоставляет другие возможности (EDIT: как журналы изменений), чтобы действительно зафиксировать все изменения. По сути, это средства, используемые системами резервного копирования, и являются сложными для событий, которые записываются. И также плохо документированы.

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

Ответ 3

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

Ответ 5

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

using System;
using System.IO;

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

            //Based on http://stackoverflow.com/questions/760904/how-can-i-monitor-a-windows-directory-for-changes/27512511#27512511
            //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 будет). Создайте новое консольное приложение С# под названием Folderwatch и скопируйте и вставьте мой код в свой Program.cs.

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

Ответ 6

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

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

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

Ответ 7

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

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

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