Как получать уведомления об изменениях файлов на CD / DVD приводе?

Я новичок в C# и должен разработать приложение Windows Form на C#. Это приложение должно отслеживать следующие вещи.

  • Мониторинг CD / DVD приводов как внешних, так и внутренних.
  • Следите за файлами, которые создаются, изменяются и удаляются на дисководах CD / DVD.

Я могу получить системное уведомление о вставке CD / DVD привода RegisterNotification и отслеживая WM_DEVICECHANGE сообщения в WndProc метод.

Приведенная выше реализация позволяет мне узнать, когда к ПК подключено новое устройство.

Проблема, с которой я сталкиваюсь, заключается в том, как отслеживать изменения файлов, которые происходят на CD / DVD (Запись / Модификация). Один из вариантов - опросить файлы на CD / DVD в качестве фонового задания. Но это будет как последний вариант.

я нашел IMAPI с помощью которого мы можем записывать на CD / DVD, но мне просто нужно следить за изменениями файлов в целях аудита.

Пожалуйста, укажите мне правильное направление о том, как получать изменения файла в уведомлении CD / DVD в моей программе?

я пытался FileSystemWatcher но, похоже, он не работает с приводами CD / DVD.

Обновлено 07 февраля 2018 года:

Другой подход, который я мог найти, был через WMI запросы, которые прикреплены к WMI Events, Я нашел вопрос Best way to detect dvd insertion in drive c# который также может содержать ответ. Я хотел знать, возможно ли обнаружение модификации файловой системы DVD в WMI, и могут ли эксперты поделиться этим запросом. Я надеюсь, что Arshad сможет помочь в этой области.

1 ответ

Решение

Подход 1: Использование FileSystemWatcher

public void ListOpticalDiscDrivesAndWatchRootDirectory()
{
    var drives = DriveInfo.GetDrives();

    foreach (var drive in drives)
    {
        if (drive.IsReady && drive.DriveType == DriveType.CDRom)
        {
            var rootDirectory = drive.RootDirectory.ToString();
            Console.WriteLine(rootDirectory);
            Watch(rootDirectory);
        }
    }
}

private void Watch(string path)
{
    var watcher = new FileSystemWatcher
    {
        Path = path,
        NotifyFilter = NotifyFilters.Attributes |
        NotifyFilters.CreationTime |
        NotifyFilters.DirectoryName |
        NotifyFilters.FileName |
        NotifyFilters.LastAccess |
        NotifyFilters.LastWrite |
        NotifyFilters.Security |
        NotifyFilters.Size,
        Filter = "*.*",
        EnableRaisingEvents = true
    };

    watcher.Changed += new FileSystemEventHandler(OnChanged);
}

private void OnChanged(object source, FileSystemEventArgs e)
{
    Console.WriteLine("Something changed!");
}

Подход 2: Использование WMI

Есть пример кода проекта (VBScript), описывающий, как использовать WMI для мониторинга файловой системы. Я использовал запрос из этого примера во фрагменте C# ниже:

using System;
using System.Management;

public class OpticalDriveWatcher
{
    private ManagementEventWatcher _wmiWatcher = new ManagementEventWatcher();

    public ManagementEventWatcher WmiWatcher
    {
        get { return _wmiWatcher; }
    }

    private void OnWmiEventReceived(object sender, EventArrivedEventArgs e)
    {
        Console.WriteLine("WMI event!");
    }

    public void WatchWithWMI(string path)
    {
        string queryString = "Select * From __InstanceOperationEvent "
                           + "WITHIN 2 "
                           + "WHERE TargetInstance ISA 'CIM_DataFile' "
                           + $"And TargetInstance.Drive='{path}'";

        WqlEventQuery wmiQuery = new WqlEventQuery(queryString);
        WmiWatcher.Query = wmiQuery;
        WmiWatcher.Start();
    }
}

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

var detector = new OpticalDriveDetector();
var drive = "I:"; //You could get the optical drive you want to watch with DriveInfo as described in approach 1
detector.WatchWithWMI(drive);
detector.WmiWatcher.EventArrived += detector.OnWmiEventReceived;

Оба подхода хорошо работали, когда я тестировал DVD-RAM.

Другие вопросы по тегам