2012-11-30 9 views
10

ポーリングなしでファイルを監視するためのhaskellライブラリ関数はありますか?私はこのようにいろいろ書いを行うだろうポーリングでHaskell:ポーリングなしでファイルを監視する(linuxでàla inotify)

monitor file mtime handler = do 
    threadDelay n -- sleep `n` ns 
    t <- getModificationTime file 
    if t > mtime 
     then handler >> monitor file t handler 
     else monitor file mtime handler 

私が欲しいものは、システムによってウェイクアップされ、ブロッキングgetModificationTimeのようなものです。利用できるものはありますか?

私はより良い:-)

編集それが唯一のPOSIXシステムのために利用可能であった場合には完全に満足しているが、よりポータブルになります。ことだ(私はhinotifyを知っているが、私はMac上でですなぜ私はPOSIXについて言及しますか?)

+3

プラットフォームに応じて 'hinotity'と' kqueue'を囲むラッパーが面白いかもしれません。 – singpolyma

+0

興味深い質問。申し訳ありませんが、これもWindows上に何かありますか? – AndrewC

答えて

5

パッケージは、(GHC 7.0.3とkqueueの0.1.2.4、Mac OS X 10.6 Snow Leopardを使用して)魔法のように動作します。 (私はAPIドキュメントを見つけることができませんでしたが、いくつかの例は、githubの上でそこにいるので)

私はそれを使用して迅速なサンプルをコンパイル:

import Control.Concurrent.MVar 
import System.KQueue.HighLevel (watchFile, EventType, Watcher) 
import System.Environment (getArgs) 

watch :: MVar EventType -> FilePath -> IO Watcher 
watch chan file = 
    let handler ev = putMVar chan ev 
    in watchFile file handler 

listen :: MVar EventType -> IO() 
listen chan = takeMVar chan >>= print >> listen chan 

main :: IO() 
main = do 
     args <- getArgs 
     chan <- newEmptyMVar 
     mapM (watch chan) args 
     listen chan 

は、これはあなたに上のファイルパスを渡すことができます小さなプログラムを作成します。これらのファイルを監視します。イベントはMVarを通してフィードバックされ、基本的にはlistenによって実装されたループであるメインスレッドによって読み込まれます。プログラムは永久に実行するように設計されているため、^Cを使用してプログラムを強制終了する必要があります。

6

fsnotifyパッケージがシステム固有のライブラリを使用し、ポーリングに戻ったGSoCプロジェクトがありました。 Macではhfseventsを使用します。

+0

はいいライブラリのようです。私はそれをビルドしてインストールしようとしましたが(GHC 7.0.3、Mac OS X 10.6)、hfseventsの問題のため動作しませんでした。だから私は上記の解決策に固執するつもりです。 – scravy

+0

hfseventsのメンテナーにバグ報告をしてもらうことができれば幸いです。 –

関連する問題