Watch the File System for Changes
R binding for ‘libfswatch’, a file system monitoring library. This uses the optimal event-driven API for each platform:
ReadDirectoryChangesW
on WindowsFSEvents
on MacOSinotify
on Linuxkqueue
on BSDFile Events Notification
on Solaris/IllumosWatching is done asynchronously in the background, without blocking the session.
Install the current development version of watcher using:
::pak("r-lib/watcher") pak
watcher requires the ‘libfswatch’ library.
Create a ‘Watcher’ using watcher::watcher()
.
By default this will watch the current working directory recursively
and write events to stdout
.
Set the callback
argument to run an R function, or
rlang
-style formula, every time a file changes:
later
package to execute the callback when R
is idle at the top level, or whenever later::run_now()
is
called, for instance automatically in Shiny’s event loop.library(watcher)
<- file.path(tempdir(), "watcher-example")
dir dir.create(dir)
<- watcher(dir, callback = ~print(.x), latency = 0.5)
w
w#> <Watcher>
#> Public:
#> initialize: function (path, callback, latency)
#> path: /tmp/Rtmp9R4IEk/watcher-example
#> running: FALSE
#> start: function ()
#> stop: function ()
#> Private:
#> watch: externalptr
$start()
w
file.create(file.path(dir, "newfile"))
#> [1] TRUE
file.create(file.path(dir, "anotherfile"))
#> [1] TRUE
::run_now(1)
later#> [1] "/tmp/Rtmp9R4IEk/watcher-example/newfile"
#> [1] "/tmp/Rtmp9R4IEk/watcher-example/anotherfile"
<- file(file.path(dir, "newfile"), open = "r+")
newfile cat("hello", file = newfile)
close(newfile)
::run_now(1)
later#> [1] "/tmp/Rtmp9R4IEk/watcher-example/newfile"
file.remove(file.path(dir, "newfile"))
#> [1] TRUE
::run_now(1)
later#> [1] "/tmp/Rtmp9R4IEk/watcher-example/newfile"
$stop()
wunlink(dir, recursive = TRUE, force = TRUE)
Thanks to the authors of ‘libfswatch’, upon which this package is based: