2012-10-18 13 views
5

Często jest to wzór, który chcę sondować plik do zmian (kiedy został ostatnio napisany). Kiedy plik zmienia się z poprzedniej wartości, chcę wykonać jakąś funkcję. Coś w formie.Przepytanie pliku do zmiany?

(poll-for-changes file-str on-change-fx current-value) 

gdzie

  1. file-str to tylko ciąg znaków, który określa lokalizację plików
  2. on-change-fx to funkcja powinna zostać wywołana, gdy plik na file-str zmian. Powiedzmy, że on-change-fx powinien zająć obiekt File wskazując na file-str jako argument.
  3. current-value aktualna wartość pliku w milisekundach. Możesz ustawić wartość 0, aby zagwarantować, że ta funkcja będzie działać co najmniej raz, lub do rzeczywistej wartości, aby uruchomić tę funkcję tylko wtedy, gdy faktycznie wykryjesz zmianę.

Po prostu chciałbym, aby ta funkcja została wdrożona w możliwie jak najbardziej przejrzysty i zwięzły sposób, Clojurist. Dziękuję Ci.

Odpowiedz

5

Jeśli chcesz sondować katalog lub pliki i postępować zgodnie z nimi, to myślę, że watchtower jest całkiem niezły.

Java 7 ma usługę WatchService, która używa zdarzeń systemu plików w celu reagowania na zmiany. W takim przypadku nie sondujesz w ogóle, ale blokujesz przyszłe wydarzenie plików. Nie sądzę, że w Clojure są jakieś projekty, które wykorzystują to, chociaż spędziłem trochę czasu bawiąc się nim, aby napisać small library. Źródło dla niego is here

Nie twierdzę, że moja biblioteka jest jeszcze kompletna, ale korzysta z usługi Java 7, więc możesz użyć jej do inspiracji w swoim własnym projekcie.

5

Istnieją dwa podejścia można użyć tutaj:

  1. Use Java współdziałanie i the Java 7 WatchService API.

  2. Sprawdź i ucz się od existing idiomatic, concise code (w tym przypadku przez Stuarta Sierra), który robi coś, co chcesz. Zauważ, że używa również Java Interop.

Myślę, że opcja nr 1 jest najlepszym rozwiązaniem, a wdrożenie funkcji powinno być proste. Prawdopodobnie będziesz chciał użyć makr doto i -> oraz ->>, aby kod był bardziej czytelny.

Powiązane problemy