2012-11-30 12 views
10

Czy istnieje funkcja biblioteki haskell do monitorowania pliku bez odpytywania?Haskell: Monitoruj plik bez odpytywania (à la inotify in linux)

Z odpytywania chciałbym zrobić cos takiego:

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 

Co chcę jest coś takiego jak blokowanie getModificationTime który zostanie obudzony przez system. Czy jest coś dostępnego?

byłbym w pełni szczęśliwy, jeśli jest on dostępny wyłącznie dla systemów POSIX, ale bardziej przenośne, tym lepiej :-)

Edit: wiem hinotify, ale jestem na Mac (to dlaczego wspominam o POSIX).

+3

Owijanie wokół 'hinotity' i' kqueue' w zależności od platformy może być interesujące. – singpolyma

+0

Interesujące pytanie. Przepraszam, do _me too_ this, czy jest coś w systemie Windows? – AndrewC

Odpowiedz

5

Pakiet sugerowane przez Sjoerd Visscher działa jak czar (używając GHC 7.0.3 i KQUEUE 0.1.2.4, Mac OS X 10.6 Snow Leopard).

Skompilowałem szybki próbkę używając go (ponieważ nie mogłem znaleźć dokumentacji API, ale istnieje kilka przykładów się na 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 

To stworzy mały program, który można przekazać filepaths się jako argumenty i monitoruj te pliki. Zdarzenia są zwracane przez MVar i odczytywane przez główny wątek, który jest w zasadzie pętlą zaimplementowaną przez listen. Program musi zostać zabity przy użyciu ^C, ponieważ jest przeznaczony do uruchamiania na zawsze.

6

Był projekt GSoC, który zaowocował pakietem fsnotify, który używa bibliotek specyficznych dla systemu i wraca do odpytywania. Korzysta z hfsevents na Macu.

+0

wydaje się być niezłą biblioteką. Próbowałem go skompilować i zainstalować (GHC 7.0.3, Mac OS X 10.6), ale nie działał, ze względu na problem z hfsevents. Tak więc zamierzam trzymać się powyższego rozwiązania. – scravy

+0

Byłoby wspaniale, gdyby można było zgłosić raport o błędzie z opiekunem hfsevents, aby mógł to naprawić. –