Surveiller un fichier / Timer ?
steph_rebol27-Jun-2010/23:34:53+2:00
Bonjour

J ai encore besoin de quelques infos que je ne trouve pas avant de me lancer pour de bon.

Dans mon projet j ai besoin de surveiller un fichier, savoir s il a été modifié. Pour cela, en delphi, à l aide d un timer je verifie la date de la derniere modif et si elle est differente de la date stockée, j effectue un traitement.
Bon ok il y a peut etre (tres certaineement mieux mais mon niveau fait que là je peux pas faire mieux )

Dois-je proceder de la même maniere en rebol ou existe t il une fonction qui s en charge ?

merci pour vos conseils
Didec28-Jun-2010/10:25:35+2:00
Salut,

Oui, Rebol sait gérer des timers, mais il ne sait le faire nativement que sur des éléments d'une fenêtre View.
Autrement dit, il faut que le programme ai une interface graphique. S'il n'affiche rien, pas de timer !

Voici comment :
http://www.rebol.com/how-to/feel.html#section-15

Un petit exemple vaut mieux qu'un long discours :
Rebol []

; le répertoire à tester. 'dirize assure qu'il se termine par un "/"
rep: dirize %/c/windows/

verif-rep: has [contenu] [
   if not empty? contenu: read rep [
      print [now/time "Il y a quelquechose dans" rep ":" newline contenu]
   ]
]

view layout [
   title (join "Vérif de " rep) rate 0:1 feel [
      engage: func [face action event] [
       if action = 'time [verif-rep]
      ]
   ]
][/code]

[code]Rebol []

rep: %/c/Mon-repertoire

verif-rep: does [
Didec28-Jun-2010/10:26:42+2:00
Désolé, posté un peu vite, je recommence pour le code.
Rebol []

; le répertoire à tester. 'dirize assure qu'il se termine par un "/"
rep: dirize %/c/windows/

verif-rep: has [contenu] [
	if not empty? contenu: read rep [
		print [now/time "Il y a quelquechose dans" rep ":" newline contenu]
	]
]

view layout [
	title (join "Vérif de " rep) rate 0:1 feel [
		engage: func [face action event] [
		    if action = 'time [verif-rep]
		]
	]
]
Philippe28-Jun-2010/14:06:21+2:00
Bonjour,

J'ai retrouvé dans mes archives un script qui surveillait l'état d'une liste de site (un clone d'un script de RT, de mémoire).
Tu peux modifier l'objet test-http pour faire en sorte de vérifier par exemple la date du fichier (modified? %mon-fichier ou modified? my-url ) au lieu de faire un "search" dedans.

REBOL [
        Title: "Check Sites"
        Needs: [view 1.3.2]
    ]

    time-out: 5  ; Seconds to wait for the connection (adjust it!)
    poll-time: 00:00:06  ; devrait être relatif au nbre de sites du fait du "read"
    system/schemes/default/timeout: system/schemes/http/timeout: time-out
    sites: [
        ; Liste : 1 ligne = 1 block = [1 URL + 1 label + 1 keyword ] (http or tcp are allowed)
        [ http://www.yahoo.fr   "Yahoo.fr"  "html" ]
        [ http://www.google.com   "Google.com"  "html" ]
    ]

	test-http: make object! [
		ping: func [
			url [url!]
			{fonction pour tester les urls et leurs contents
			si pas /search : renvoie soit l'erreur, soit le contenu de la page
			si /search et un mot-clé : renvoie true si le mot-clé est trouvé, false sinon}
			/search kwd
			/local test val ][
			test: either error? err: try [
				val: read url
				][
				mold disarm :err ][val]
			if search [ test: either find/last test kwd [true][false] ]
			return test
			]
	] ; end test-http


; ------ layout -----------------------------------
    img: make image! [150x15 0.0.0.255]
    draw img [
        pen coal
        fill-pen linear 0x0 0 44 89 1 1 silver gray coal silver
        box 8.0 0x0 149x14
    ]

    out: [
	backeffect [gradient 0x1  black coal]
	; c'est poller qui sert de timer pour checker les sites
	poller: txt 0x0 "" rate poll-time feel [
            engage: func [f a e] [
			if find [time] a [ check-sites  ]
			]
		]
	]
    foreach site sites [
        ;port: make port! site/1
        append out compose/deep [
            image img (site/2) [check-site face] [browse face/data]
            with [
				data:  (copy site/1)
				font/size: 10
				font/style: 'bold
				font/shadow: none
				font/align: 'center
				font/valign: 'middle
				user-data: (copy site/3)
				]
        ]
    ]

    append out [
		across
        pad 0x100
		text "Polling : " white font-size 10
		frequency: rotary coal 99x14 data [ "0.1 minute" "0.5 minute" "1 minute" "5 minutes" "15 minutes" "30 minutes" ]
		effect [
		draw [pen coal fill-pen linear 0x0 0 44 89 1 1 silver gray coal silver
		box 9.0 0x0 99x14 ]
		]
		edge [size: 0x0 color: coal effect: none]
		font [
				name: "Verdana"
				style: none ; 'bold
				size: 10
				color: 255.255.255
				offset: 2x2
				space: 0x0
				align: 'center
				valign: 'middle
				shadow: none ;1x1
				colors: [255.255.255 coal]
		]  [
			val: 60 * to-decimal (first parse frequency/data/1 "")
			poller/rate: to-time val
			show poller
		]
		return
		pad 0x10
		across
		; c'est le bouton refresh qui sert de timer.
        refresh: btn 70 93.155.216 "Refresh" font-color white [ check-sites  ]
		pad 7x0
		btn 70 "Quit" 166.0.0 [quit] font-color white
		; loggy: txt rejoin [" next test : " test-heure ]
    ]

    color-face: func [face color] [
        face/effect: reduce ['colorize color]
        show face
    ]


    check-site: func [face /local col-face] [
        color-face face gray
        color-face face  col-face: either attempt [ test-http/ping/search face/data face/user-data][green][red]
		  ]

    check-sites: does [
        foreach face out/pane [
            if face/style = 'image [check-site face]
        ]
    ]

    out: layout out
    view/new/options center-face out [no-title no-border]
    check-sites
    do-events




===Philippe
steph_rebol28-Jun-2010/23:05:53+2:00
merci, je vais etudier cela avec attention mais c est tout de même tres deroutant ce language...
Le plus dur est je crois faire abstraction de mes connaissances en Pascal, mais reflexes obliges, c est pas evident...
Didec29-Jun-2010/9:51:58+2:00
Le plus déroutant c'est la notion de "dialecte".

Par exemple, dans le code que je t'ai donné plus haut, il faut bien avoir à l'esprit que ce qui se trouve dans le block! qui suit le mot 'layout est un dialecte (le "VID") qui permet de décrire une interface graphique. On peut y trouver des mots qui ont alors un sens différent que celui qu'ils peuvent avoir dans un autre dialecte, ou dans du code.

Pour faire un parallèle, le mot "table" à un sens différent selon son contexte. Si on parle de mobilier, c'est un meuble. Si on parle d'interface graphique, c'est une sorte de grille, si on parle de base de données, c'est un élément structuré de cette BDD, si on parle mathématique, on pense multiplications...

Dans le dialecte VID, on peut aussi définir des fonctions utilisées pour personnaliser le comportement de l'interface graphique. C'est le cas de ce qui se trouve dans le block suivant le mot 'feel. "feel" est un mot du dialecte VID indiquant que ce qui suit est une redéfinition d'une ou plusieurs fonctions appelées par les événements de l'interface.

On est alors en permanence en train de changer de contexte de pensée. Le code Rebol est en fait un dialecte "do" (du nom de la fonction qui interprète le code. Et lors de l'exécution de ce code, on utilise d'autres dialectes (comme le "VID") qui peuvent eux mêmes contenir du dialecte "do"...

Cette notion est très puissante au niveau programmation, mais elle a comme revers d'exiger de celui qui lit le code de connaitre ces sous-langages afin de comprendre ce qu'il lit.

Mais il suffit d'apprendre les rudiments de chaque dialecte au fur et à mesure de ses besoins. Ce n'est pas si compliqué.

La 1ère étapes est de connaitre les mots qui bascule vers l'utilisation d'un de ces dialecte (layout, parse, secure, ...).

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2