43 lines
1.6 KiB
Markdown
43 lines
1.6 KiB
Markdown
# Watching Directory Trees
|
|
|
|
Monitor an entire directory hierarchy for filesystem events.
|
|
|
|
## Overview
|
|
|
|
The Linux inotify API watches individual directories — it does not descend into subdirectories automatically. The ``Inotify/Inotify`` actor offers two convenience methods that handle the recursion for you.
|
|
|
|
### Recursive Watch
|
|
|
|
Call ``Inotify/Inotify/addRecursiveWatch(forDirectory:mask:)`` to walk the directory tree once and install a watch on every subdirectory that exists at the time of the call:
|
|
|
|
```swift
|
|
let inotify = try Inotify()
|
|
let descriptors = try await inotify.addRecursiveWatch(
|
|
forDirectory: "/home/user/project",
|
|
mask: [.create, .modify, .delete]
|
|
)
|
|
```
|
|
|
|
The returned array contains one watch descriptor per directory. Subdirectories created **after** this call are not covered.
|
|
|
|
### Automatic Subtree Watching
|
|
|
|
When you also want future subdirectories to be picked up, use ``Inotify/Inotify/addWatchWithAutomaticSubtreeWatching(forDirectory:mask:)`` instead:
|
|
|
|
```swift
|
|
let descriptors = try await inotify.addWatchWithAutomaticSubtreeWatching(
|
|
forDirectory: "/home/user/project",
|
|
mask: [.create, .modify, .delete]
|
|
)
|
|
```
|
|
|
|
Internally this listens for `CREATE` events carrying the ``InotifyEventMask/isDir`` flag and installs a new watch with the same mask whenever a subdirectory appears.
|
|
|
|
### Choosing the Right Method
|
|
|
|
| Method | Covers existing subdirectories | Covers new subdirectories |
|
|
|--------|:----:|:----:|
|
|
| ``Inotify/Inotify/addWatch(path:mask:)`` | No | No |
|
|
| ``Inotify/Inotify/addRecursiveWatch(forDirectory:mask:)`` | Yes | No |
|
|
| ``Inotify/Inotify/addWatchWithAutomaticSubtreeWatching(forDirectory:mask:)`` | Yes | Yes |
|