【发布时间】:2017-10-31 09:15:13
【问题描述】:
我正在尝试创建一个类来监控 Linux 上的 USB 设备到达和移除。在 Linux 上,USB 设备表示为/dev/bus/usb 下的设备文件,这些设备文件是为响应这些事件而创建/删除的。
似乎跟踪这些事件的最佳方法是使用FileSystemWatcher。为了使类可测试,我使用System.IO.Abstractions 并在构造过程中将IFileSystem 的实例注入到类中。我想要的是创建一些行为类似于FileSystemWatcher 但监视注入的IFileSystem 的更改,而不是直接监视真正的文件系统。
查看System.IO.Abstractions 中的FileSystemWatcherBase 和FileSystemWatcherWrapper,我不知道该怎么做。目前我有这个(我知道这是错误的):
public DevMonitor(
[NotNull] IFileSystem fileSystem,
[NotNull] IDeviceFileParser deviceFileParser,
[NotNull] ILogger logger,
[NotNull] string devDirectoryPath = DefaultDevDirectoryPath)
{
Raise.ArgumentNullException.IfIsNull(logger, nameof(logger));
Raise.ArgumentNullException.IfIsNull(devDirectoryPath, nameof(devDirectoryPath));
_fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
_deviceFileParser = deviceFileParser ?? throw new ArgumentNullException(nameof(deviceFileParser));
_logger = logger.ForContext<DevMonitor>();
_watcher = new FileSystemWatcherWrapper(devDirectoryPath);
}
【问题讨论】:
-
我能问下反对票的用途是什么吗?
-
我认为这不可能。 FileSystemWatcher 类根本不可扩展(甚至没有任何有用的虚拟方法)。取而代之的是-在具有
Created等事件的某些接口后面抽象出FileSystemWatcher,并在您的单元测试中手动触发这些事件。因此,在将目录添加到您的IFileSystem之后 - 自己触发相应的事件。 -
这是一种方式,但我希望我不必诉诸于此。我没想到他们会直接扩展
FileSystemWatcher,但可能会有一些类似于工厂IFileSystem => IFileSystemWatcher的东西,它检查提供的IFileSystem是真实的还是模拟的。如果是真的,则返回标准FileSystemWatcher的包装器。如果是 mock,则返回一个自定义类来监视对 mock 文件系统的更改。 -
我猜你必须自己实现它,或者提交关于它的 github 问题并希望作者能够实现它。已经存在关于实现模拟 FileSystemWatcher 的问题:github.com/tathamoddie/System.IO.Abstractions/issues/167,它已经 1 岁了,所以我不希望很快得到结果。
-
啊,干杯。太糟糕了。
标签: c# filesystems filesystemwatcher