2011-03-22 37 views
17

按照API docs for Node 0.4.3,在fs.watchFile(filename, [options], listener)功能啓動例程將Node.JS:「fs.watchFile」如何工作?

手錶上filename變化。每次訪問文件時將調用callback偵聽器。

它還說

options如果提供的話應該是包含兩個成員的布爾,persistent的對象,並且interval,以毫秒爲單位的輪詢值

這表明它會根據間隔時間檢查每一個。但它也說

默認爲{ persistent: true, interval: 0 }

那麼這是否意味着它會檢查每毫秒,以查看文件時間是否更改?它是否監聽操作系統級別的事件?這是如何運作的?

+1

我認爲這是一個重複http://stackoverflow.com/questions/4482352/node-js-fs-watchfile-persistent-watch-mechanics – 2011-03-22 16:43:03

+0

請參閱tjameson的答案:雖然它可能是重複的,但答案提供那個老問題已經過時了。我認爲截至2013年,還有更多現代解決方案比比皆是。 – 2013-08-04 19:54:31

+0

值得注意的是,在Node v6中,缺省值是'{persistent:true,interval:5007}'。 0的間隔不合邏輯。在提出問題時,它看起來並不是這樣,但[C源代碼中的當前實現](https://github.com/nodejs/node/blob/db1087c9757c31a82c50a1eba368d8cba95b57d0/deps/uv/src/) fs-poll.c#L77)將0改爲1:'ctx-> interval = interval?間隔:1;'。 – Nateowami 2017-03-15 03:51:04

回答

12

是的,cpedros是正確的,這似乎是重複的。不過我想我可以更多地瞭解這一點。

每個操作系統都有自己的文件更改事件被觸發。在Linux上,它是inotify(以前是dnotify),在Mac上是fsevents,在Windows上是FileSystemWatcher。我不確定底層代碼是否處理每個案例,但這是一般的想法。

如果你只是想在Linux上觀看一個文件,我推薦node-inotify-plus-plus。如果你想看一個目錄,使用inotify-plus-plus和node-walk。我已經實現了這一點,它像一個魅力。

如果您有興趣,我可以發佈一些代碼。 node-inotify-plus-plus背後的美妙之處在於,它吸收了inotify的大部分缺陷,併爲偵聽文件上的特定事件提供了直觀的API。

編輯:這不應該用來觀看噸文件。在我的系統上,最大值爲8192.使用此命令cat /proc/sys/fs/inotify/max_user_watches可以找到最大值。這可以用來觀察目錄的變化,然後從那裏找出單個文件。如果直接在該目錄下的文件被修改,則修改的事件將觸發。

編輯:謝謝@guiomie指出現在完全支持在Windows上觀看文件。我認爲這是與v0.6.x版本。

+0

這是在Windows上的Cygwin(unix仿真器)上測試的,最終將在Solaris中使用。 – 2011-04-04 12:28:33

+1

Node.js只在Linux上支持,我認爲它可能在不支持inotify的情況下進行某種輪詢。 – tjameson 2011-04-04 14:51:31

+0

@tjameson:你的意思是**文件系統監聽**僅在Linux上受支持? [安裝說明](https://github.com/joyent/node/wiki/Installation)說*「Node應該在Linux,Macintosh和Solaris上開箱即用」*。這表明在Mac,Solaris上支持**。也許你應該**換言?** – 2011-04-04 16:58:41

3

爲了擴展tjameson的夢幻般的答案,您可以使用watchr來規範節點versiosn和OS之間的差異。它還提供unlinknew的事件,而不僅僅是change,並且增加了對目錄樹監視的支持。