技术解析

entr - 监视一个目录里的文件是否发生改变,在改变的时候运行指定命令
0
2021-06-15 06:45:49
idczone
https://github.com/eradman/entr

挺好用的一个小工具。不知道 Windows 上是否有类似的?
有啥场景需要运用到?


某个 Windows only 的图片生成软件,每次输出目录里增加了新文件的时候,自动调用流水线上的下一环节。

挺好的工具,我之前一直用 nodemon

fsnotify ?要自己写点代码

一直用自己写的,entr 这种兼容性很差,比如 docker 的 volume 就不行
我这个是完全跨平台的,感觉也没必要追求无 polling,gitignore 一般就够了 https://github.com/ysmood/kit#guard

找到了一个接近满足需求的例子:
https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?redirectedfrom=MSDN&view=net-5.0

除了 poll 以外还有别的啥实现方法吗

Windows 下,这种监视文件夹内文件状态改变的程序,都会遇到一个如果大量文件同时改变,容易漏消息的问题……如果一个消息处理不及时,就会漏掉临近的消息……

go 语言
github.com/fsnotify/fsnotify
针对每个平台用了不同方法,可以看看。

同步盘是不是就是通过这类触发的、本地有改变过文件,就会自动上传到网上同步盘!
云盘文件有改过、客户端也会自动同步回来

Windows 有同功能的 API,不过现成的软件似乎没有?

版主,你不会注册个马甲来发常规贴吗,你这样冠冕堂皇的发帖感觉怪怪的。。

Facebook 有个 watchman https://facebook.github.io/watchman/

git 版本变动就行了

网盘不需要这种时效性, 反而一个一个处理效率更低.
直接定时刷

付费的 hazel 是不是也是这个作用

https://github.com/watchexec/watchexec
跨平台

正好手头有一些需求,不过这个对十万级文件量的文件夹支持的好吗。

https://stackoverflow.com/questions/9402908/java-7-watch-service
我发 java 是不是显得不是很合群

我用的 nextcloud 、onedrive,这种好像只要有改变过、就会自动更新,本地传云端是这个触发!
云端同步到本地是定时吗

::ReadDirectoryChangesW(dir, ¬ify, sizeof(notify), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME, &dwBytes, &overlapped, NULL);
主要就这一个 API

这类 filewatcher 我记得都有个头痛的问题,就是如果监控的跟目录被删除了,再新建就不会再监控了,要手动处理

我在 mac 和 linux 下用的是 fswatch,我看官方 readme 里面也有 windows 的,不知道行不行

目前来讲 poll 是最稳定的方式,类似 FileSystemWatcher,fsnotify 之类的都有诸多兼容问题,比如 fsnotify 自己都说对 mac 支持不好。要是有人能有更好的解决方案我倒是很想学习下。

Windows 下面有个 Everything 工具,推荐。其中的原理是读取 NTFS 的 USN 日志。我胡乱搜了一下: https://blog.csdn.net/kaooo/article/details/8298537
对于 Linux 来说内核的 inotify 可以保证每个订阅的修改都通知到程序,Mac/BSD 的大概是 kqueue+fsevents

监控目录变动然后自动更新部署项目?

目前用 FileSystemWatcher 没发现这个问题,不要在消息响应里面写太多东西,直接接到你自己的消息队列里再处理就可以了。
我基本上每次弄进去几千上万的小文件没见出过问题。

Python 有一个 watchdog 的模块,它自带的命令就可以做到你说的这个。如果有更复杂的需求,你甚至可以写几行 Python 代码来解决。并且,Mac 、Linux 、Windows 都支持。

不错,可以放在 ftp 流程后面做分类处理

uwp 也有个函数

可以用 cygwin 来编译这个程序。

QT 有一个 QFileSystemWatcher 感觉也挺方便的。

linux 上我用 inotify,但是这个不能在挂载的网络目录用例如 smb,这个能解决么

32L 我猜的,cygwin 可以编译 linux 的程序,但是兼容性上面还得要自己试试

插个眼,明天下午来收割方案

NewFileGo 可以一试:
http://www.joejoesoft.com/vcms/170/

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服