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

2024-04-23

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

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

我可以通过以下方式获取 CD/DVD 驱动器插入的系统通知RegisterNotification并通过跟踪WM_DEVICECHANGE中的消息WndProc method.

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

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

我已经发现IMAPI通过它我们可以写入 CD/DVD,但我只需要监视文件更改以进行审计。

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

我努力了FileSystemWatcher但它似乎不适用于 CD/DVD 驱动器。

更新于 2018 年 2 月 7 日:

我能找到的另一种方法是通过WMI附加到的查询WMI Events https://msdn.microsoft.com/en-us/library/windows/desktop/aa393013(v=vs.85).aspx。我发现了一个问题Best way to detect dvd insertion in drive c# https://stackoverflow.com/questions/16207628/best-way-to-detect-dvd-insertion-in-drive-c-sharp这也可以找到答案。我想知道在 WMI 中检测 DVD 文件系统修改是否可行,以及是否有专家可以分享相同的查询。我希望如果Arshad https://stackoverflow.com/users/1498158/arshad将能够在这方面提供帮助。


方法一: 使用FileSystemWatcher https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

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 https://msdn.microsoft.com/en-us/library/aa394582(v=vs.85).aspx

有一个代码项目示例 https://www.codeproject.com/articles/42212/wmi-and-file-system-monitoring(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_数据文件 https://msdn.microsoft.com/en-us/library/aa387236(v=vs.85).aspx仅返回本地固定磁盘上的文件实例。您可以按如下方式调用它

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 进行测试时,这两种方法都对我来说效果很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 CD/DVD 驱动器上文件更改的通知? 的相关文章

随机推荐

  • Matplotlib scatter():大小、标记形状的默认值

    有没有办法设置default标记尺寸 s matplotlib 的参数plt scatter 或者同样设置标记的形状 mpl rcParams keys 有线图的设置 例如 import matplotlib as mpl mpl rcPa
  • 如何在 H2 中创建过程

    这似乎与具有相同标题的其他问题重复 但实际上并非如此 我们的业务逻辑主要作为 DB2 存储过程来实现 我看到 H2 有一个 DB2 兼容模式 很好 我们如何使用 H2 通过这些程序进行内存单元测试 不幸的是 H2 似乎缺少 CREATE P
  • Android中的适配器应该是静态内部类还是非静态内部类

    我在 Activity 中有一个 ListView 并且正在为 ListView 设置自定义适配器 我的适配器类应该是 private static class MyAdapter extends ArrayAdapter or priva
  • golang:无法从内存不足崩溃中恢复

    在某些情况下 调用append 会触发内存不足恐慌 并且append 本身似乎不会返回nil 我怎样才能避免这种恐慌情况并向我的用户显示 资源暂时不可用 此致 你不能 如果运行时无法为追加分配内存 则可能无法恢复或向用户传达 资源暂时不可用
  • Lua 中的内联条件(a == b ? "yes" : "no")?

    无论如何 Lua 中可以使用内联条件吗 Such as print blah a true blah nahblah Sure print blah a and blah or nahblah
  • 如何在 Mapbox 4.1 中添加自己的图块

    我有一个图块来源作为网址 并希望将它们添加到我的地图中 我能够做到这一点谷歌地图 and OSMDroid 但我不知道如何使用Mapbox 我的网址格式如下 http mysource x y z 我已经看到了针对网络的解决方案 但我没有找
  • 所有 iPad 和 iPad Pro 的视图之间的间距是否规则/规则?

    我最近遇到了不同 iPad 之间常规 常规尺寸类别的差异 这是我的相关问题所有 iPad 包括 iPad pro 的常规 常规头寸大小限制 https stackoverflow com questions 33958858 regular
  • 从 Angular2 服务返回一个空的 Observable

    我正在构建一个 Angular 2 应用程序 它使用服务来收集数据 该服务确实包含以下逻辑 CORE COMPONENTS import Injectable from angular core import Http Response f
  • 如何使用变量名称通过 ddply 引用数据框列?

    我正在尝试编写一个函数 该函数将保存时间序列数据的数据框的名称和该数据框中的列的名称作为参数 该函数对该数据执行各种操作 其中之一是在列中添加每年的运行总计 我正在使用plyr 当我直接将列名与 ddply 和 cumsum 一起使用时 没
  • 如何在 MySQL 中将 SELECT ON 表名授予 PUBLIC

    我是 MySQL 新手 我试图弄清楚如何使所有经过身份验证的用户都可以公开读取表格 在甲骨文中我会说grant select on tablename to public 该语法不适用于 MySQL 我无法找出等效的语法 Per MySQL
  • 查找向量中最近的点

    给定一个具有多个值的排序向量 如下例所示 std vector
  • nginx 缓存 HTML 文件该怎么办?

    我一直遇到缓存问题HTML我的项目中的文件 我有一个针对静态资源 图像 脚本 CSS 等 的缓存清除机制 但所有这些解决方案似乎都无法处理HTML缓存问题 I added expires 0 to Nginx on all HTML文件 但
  • AngularJs:只有单击两次后才会登录

    我是 AngularJs 的新手 我正在开发一个小型的角度应用程序 我的方法 我的 index html 页面有 2 部分 一个ng view and a 带有 4 个导航按钮的 div div 最初使用 ng show ng show v
  • #define 导致“预期的主表达式”错误

    define N 10 int main int x for int i 0 i
  • TVirtualStringTree 中的自动调整列大小

    攀登 TVirtualTreeView 的学习之山 我尝试创建一个自定义后代 以确保在调整控件大小时 最后一列的宽度完全填充控件的宽度 而不需要水平滚动条 我看到许多与 AutoFitColumns 相关的项目 一个方法和许多事件 但没有涵
  • 如何使用 LINQ 计算与条件匹配的元素数量

    我尝试了很多事情 但对我来说最合乎逻辑的似乎是这个 int divisor AllMyControls Take p gt p IsActiveUserControlChecked Count AllMyControls是一个集合UserC
  • 在屏幕上滑动手指激活按钮,就像按下按钮一样

    如果我的标题不够清楚 我会详细解释一下 假设我们有一个充满多个按钮 10 多个 的屏幕 我们按下一个按钮 激活 onTouch onClick 如果我们现在移动手指而不抬起它 我希望它激活它滑过的任何其他按钮 在这种特殊情况下 我希望当您滑
  • 使用 PHP 将音频文件转换为波形

    我正在寻找 PHP 类 它将获取音频文件并返回波形的图像文件 可以在此处看到类似的效果http soundcloud com rollin fire cru sets house house house house http soundcl
  • 如何获取Linux发行版名称和版本?

    在 Windows 中我读取注册表项SOFTWARE Microsoft Windows NT CurrentVersion ProductName获取操作系统的全名和版本 但在Linux中 代码 struct utsname ver un
  • 如何获取 CD/DVD 驱动器上文件更改的通知?

    我是 C 新手 必须使用 C 开发 Windows 窗体应用程序 该应用程序应跟踪以下内容 监控外部和内部的 CD DVD 驱动器 监控 CD DVD 驱动器上创建 修改和删除的文件 我可以通过以下方式获取 CD DVD 驱动器插入的系统通