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,而不是当发出 调用时,系统将开始监听事件。

返回值是一个 endless broadcast 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);
}