gpt4 book ai didi

c# - 如何获取 CD/DVD 驱动器上文件更改的通知?

转载 作者:太空狗 更新时间:2023-10-29 18:30:44 35 4
gpt4 key购买 nike

我是 C# 的新手,必须使用 C# 开发 Windows 窗体应用程序。此应用程序应跟踪以下内容。

  • 监控外部和内部的 CD/DVD 驱动器。
  • 监控在 CD/DVD 驱动器上创建、修改和删除的文件。

我可以通过 RegisterNotification 和跟踪 WndProc 方法中的 WM_DEVICECHANGE 消息来获取 CD/DVD 驱动器插入的系统通知。

上面的实现让我知道新设备何时连接到 PC。

我面临的问题是如何跟踪 CD/DVD 上发生的文件更改(写入/修改)。一种选择是轮询 CD/DVD 中的文件作为后台作业。但是,这将是最后的选择。

我找到了 IMAPI,我们可以通过它写入 CD/DVD,但我只需要监控文件更改以进行审核。

请为我指明正确的方向,了解如何在我的程序中接收 CD/DVD 通知上的文件更改?

我试过 FileSystemWatcher 但它似乎不适用于 CD/DVD 驱动器。

2018 年 2 月 7 日更新:

我能找到的另一种方法是通过附加到 WMI EventsWMI 查询.我发现了一个问题Best way to detect dvd insertion in drive c#这也可以包含答案。我想知道在 WMI 中检测 DVD 文件系统修改是否可行,是否有专家可以分享相同的查询。我希望如果 Arshad将能够在这方面提供帮助。

最佳答案

方法 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

有一个 code project sample (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 测试时,这两种方法对我来说都很好。

关于c# - 如何获取 CD/DVD 驱动器上文件更改的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560855/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com