watch 方法

Stream<FileSystemEvent> watch({
  1. int events = FileSystemEvent.all,
  2. bool recursive = false,
})

开始监视 FileSystemEntity 的变化。

实现使用平台依赖的事件驱动 API 来接收文件系统通知,因此行为取决于平台。

  • Windows:使用 ReadDirectoryChangesW。实现仅支持监视目录。递归监视受支持。

  • Linux:使用 inotify。实现支持监视文件和目录。递归监视不受支持。注意:当直接监视文件时,删除事件可能不会按预期发生。

  • OS X:使用 文件系统事件 API。实现支持监视文件和目录。递归监视受支持。此 API 有一些限制

    • 在调用 watch 方法之前不久发生的变化可能仍会出现在 Stream 中。
    • 短时间内发生的变化可能顺序混乱。
    • 单个目录中做出的多次更改可能被合并为一个 FileSystemEvent

系统将在返回的 Stream 被监听时开始监听事件,而不是在发出 watch 调用时。

返回值是一个无限广播 Stream,仅在以下情况之一发生时停止

  • Stream 被取消,例如通过在 StreamSubscription 上调用 cancel
  • 监视的 FileSystemEntity 被删除。
  • 系统监视器意外退出。例如,在 Windows 上,当接收 ReadDirectoryChangesW 事件的缓冲区溢出时会发生这种情况。

使用 events 来指定要监听哪些事件。可以在 FileSystemEvent 中的常量之间进行或运算以混合事件。默认为 FileSystemEvent.all

移动事件可能被报告为单独的删除和创建事件。

实现

Stream<FileSystemEvent> watch(
    {int events = FileSystemEvent.all, bool recursive = false}) {
  // FIXME(bkonyi): find a way to do this using the raw path.
  final String trimmedPath = _trimTrailingPathSeparators(path);
  final IOOverrides? overrides = IOOverrides.current;
  if (overrides == null) {
    return _FileSystemWatcher._watch(trimmedPath, events, recursive);
  }
  return overrides.fsWatch(trimmedPath, events, recursive);
}