2012-11-30 32 views
10

क्या मतदान के बिना फ़ाइल की निगरानी करने के लिए कोई हैकेल लाइब्रेरी फ़ंक्शन है?हास्केल: मतदान के बिना फ़ाइल की निगरानी करें (लिनक्स में à la inotify)

मतदान के साथ मैं इस तरह someting करना होगा:

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 हूँ (जो मैं पीओएसईक्स का जिक्र क्यों करता हूं)।

+3

प्लेटफार्म के आधार पर 'हिनोटिटी' और 'क्यूक्यू' के चारों ओर एक रैपर दिलचस्प हो सकता है। – singpolyma

+0

दिलचस्प सवाल। _me too_ के लिए खेद है, क्या विंडोज़ पर कुछ भी है? – AndrewC

उत्तर

5

पैकेज जोएर्ड Visscher ने सुझाव दिया एक आकर्षण (GHC 7.0.3 और kqueue 0.1.2.4, मैक ओएस एक्स 10.6 हिमपात तेंदुए का प्रयोग करके) की तरह काम करता है।

मैं एक त्वरित नमूना इसे प्रयोग संकलित (के बाद से मैं 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 

यह एक छोटे से प्रोग्राम है जो आप के रूप में पर filepaths पारित कर सकते हैं पैदा करेगा तर्क और इन फ़ाइलों की निगरानी। घटनाओं को MVar के माध्यम से वापस खिलाया जाता है और मुख्य धागे द्वारा पढ़ा जाता है जो मूल रूप से listen द्वारा कार्यान्वित एक लूप होता है। कार्यक्रम को ^C का उपयोग करके मारना होगा क्योंकि इसे हमेशा के लिए चलाने के लिए डिज़ाइन किया गया है।

6

एक जीएसओसी परियोजना थी जिसके परिणामस्वरूप fsnotify पैकेज सिस्टम-विशिष्ट पुस्तकालयों का उपयोग करता है, और मतदान पर वापस आ जाता है। यह मैक पर hfsevents का उपयोग करता है।

+0

एक अच्छी पुस्तकालय प्रतीत होता है। मैंने इसे बनाने और स्थापित करने की कोशिश की (जीएचसी 7.0.3, मैक ओएस एक्स 10.6) लेकिन यह काम नहीं किया, hfsevents के साथ एक समस्या के कारण। तो मैं उपरोक्त समाधान के साथ चिपकने जा रहा हूँ। – scravy

+0

यह बहुत अच्छा होगा अगर आप hfsevents के रखरखाव के साथ एक बग रिपोर्ट दर्ज कर सकते हैं ताकि वह इसे ठीक कर सके। –