Comparaison de repertoire dans le temps
none1-Dec-2010/23:50:55+1:00
Bonjour,
J'ai la problématique suivante : je dois scruter chaque soir un repertoire et faire des miniatures des images.
Comme les images sont sur un serveur distant et que le nombre d'images ne cessent d'augmenter, il faut travailler en différentiel.
Ne faire des miniatures que des nouvelles images et des images déjà miniaturisées.
J'ai déjà le programme qui créé les miniatures.
Pour la comparaison de contenu du répertoire, je marne un peu.
Je voulais utiliser simplement la fonction difference mais cela ne semble pas aussi simple que cela...

-]-nve-[-
nve1-Dec-2010/23:56:37+1:00
PS: J'ai réussi a poster en mon connectant mais il n'a pas gardé mon login (none apparaît). J'étais depuis un BlackBerry.

-]-nve-[-
Didec2-Dec-2010/9:31:28+1:00
Salut,

Avec "read %/mon/repertoire tu obtiens un block! avec le contenu du répertoire. Tu peux donc le stocker avec 'save et le recharger avec 'load.

Tu pourra donc comparer le block de la veille ainsi rechargé avec le contenu actuel du répertoire.

Bref, tout ça tu ne l'a pas dit, mais je suppose que tu l'as déjà fait.

Alors, qu'as-tu observé comme problème en utilisant 'difference entre ces 2 block! ?
nve2-Dec-2010/11:13+1:00
Pour 'difference, justement la problématique est que je n'arrive pas remettre mes données sous forme de 2 block!
pour que 'difference fonctionne correctement.

Je ne connaissais pas 'save.

Effectivement, cela peut fonctionner comme cela.
Néanmoins pour le cas d'une image qui a été modifié, il faut la notion de date.

-]-nve-[-
Didec2-Dec-2010/14:19:50+1:00
Effectivement, pour vérifier les modifs, il faut enregistrer la date de modif de chaque fichier quelque-part.

Idée :
1) lire le contenu du répertoire => block! des noms de fichier/dossier.
2) pour chaque fichier/dossier, lire la date de modif (get-mode %nom-du-fichier 'modification-date) et l'ajouter à la suite du nom du fichier dans le block!
; exemple :
lst: read %./
forall lst [
    lst: back insert next lst get-modes lst/1 'modification-date
]
probe lst


3) lire le block! sauvegardé la fois d'avant (s'il y en a un, sinon on met un block! vide)
; exemple :
blk: any [all [exists? fic: %etat-dossier.txt load fic] make block! 20]


4) ... et bien c'est là qu'il faut s'employer à comparer les contenus des 2 listes.
Bon je te laisse incuber un peu de ton coté
Didec2-Dec-2010/14:21:22+1:00
Petite précision pour le point 2, ça marche bien car je lis le répertoire courant, mais si ce n'est pas le cas, ça plante ! Une solution :
[ocde]lst: read dir: %un-dossier/
forall lst [
   lst: back insert next lst get-modes dir/(lst/1) 'modification-date
] probe lst[/code]
Didec2-Dec-2010/14:21:53+1:00
Le même lisible !!!!
lst: read dir: %un-dossier/
forall lst [
   lst: back insert next lst get-modes dir/(lst/1) 'modification-date
] probe lst
nve2-Dec-2010/18:07:01+1:00
Effectivement, il faut que j'ingère tout cela.
Par contre, si je fais en gros new-lst (contenu du répertoire actuel) et old-lst (old-lst qui est le contenu du répertoire rechargé du fichier .txt) et que je fais un 'difference.
Effectivement, avec la méthodologie que tu m'as donné, j'arrive bien à faire correctement la différence.
Par contre, logiquement, j'obtiens les différences mais que les dates puisque le nom des fichiers ne change pas.
J'ai donc pensé à faire un 'select pour récupérer la date et comparer les 2 dates.
Il faut donc écrire une function qui réalise la différence selon les critères qui nous intéresse.
nve2-Dec-2010/23:29:26+1:00
Si on utilise la méthode de faire un 'select sur le fichier dans l'ancienne liste et dans la nouvelle liste et obtenir la différence...
Je me demande bien si cela rapide.

Bon un début de fonction :

diff-directories: func [dir [file!] /local new-lst old-lst file diff] [
	new-lst: read dir
	forall new-lst [
	   new-lst: back insert next new-lst get-modes dir/(new-lst/1) 'modification-date
	]
	old-lst: any [all [exists? fic: %old-lst.txt load fic] make block! 20]
	if (length? old-lst) > 0 [
		forskip new-lst 2 [
			file: pick new-lst 1
			new-date: select new-lst file
			old-date: select old-lst file
			print rejoin ["File = " file ", old-date = " old-date ", new-date = " new-date]
			diff: difference new-date old-date
			if diff > 0:00 [print file]
		]
	]
	save %old-lst.txt new-lst
]
diff-directories %./
nve2-Dec-2010/23:30:56+1:00
Par contre, il bloque lorsqu'il traite le fichier old-lst.txt...

File = old-lst.txt, old-date = none, new-date = 2-Dec-2010/23:18+1:00
** Script Error: difference expected set2 argument of type: series bitset date
** Where: forskip
** Near: diff: difference new-date old-date
if


Mais je n'arrive pas à comprendre pourquoi...
nve3-Dec-2010/0:00:02+1:00
Si je mets le fichier old-lst.txt dans un sous répertoire, ca marche ?#!
Didec3-Dec-2010/13:15:24+1:00
Et bien, il me semble que tu ne vérifie pas si le fichier que tu prend dans la nouvelle liste existe dans l'ancienne.

Le "old-date: select old-lst file" va donner 'none à 'old-date si le fichier n'est pas trouvé. Il faut donc vérifier si 'old-date est à 'none avant de calculer la différence des 2 dates.
...
			print rejoin ["File = " file ", old-date = " old-date ", new-date = " new-date]
			if any [not new-date  not old-date 0:00 < diff: difference new-date old-date ][print file]
...
nve3-Dec-2010/15:14:09+1:00
Bon voilà, j'ai une version à peu près bien foutu.
J'attends la revue de code pour correction...

diff-directories: func [dir [file!] /date /full /local new-lst old-lst file diff diff-lst] [
	diff-lst: []
	new-lst: read dir
	forall new-lst [
		new-lst: back insert next new-lst get-modes dir/(new-lst/1) 'modification-date
	]
	old-lst: any [all [exists? fic: %old-lst.txt load fic] make block! 20]
	save %old-lst.txt new-lst
	if (length? old-lst) > 0 [
		if any [date full] [
			forskip new-lst 2 [
				file: pick new-lst 1
				new-date: select new-lst file
				old-date: select old-lst file
				if any [not new-date not old-date 0:00 < diff: difference new-date old-date][append diff-lst file]
			]
		]
	]	
	if not date [
		new-lst: head new-lst
		while [not tail? new-lst][either date? first new-lst [new-lst: remove new-lst][new-lst: next new-lst]]
		new-lst: head new-lst
		either (length? old-lst) > 0 [
			old-lst: head old-lst
			while [not tail? old-lst][either date? first old-lst [old-lst: remove old-lst][old-lst: next old-lst]]
			old-lst: head old-lst
			diff: difference new-lst old-lst
			append diff-lst diff
		][append diff-lst new-lst]
	]
	return copy diff-lst
]


-]-nve-[-
Didec3-Dec-2010/16:35:18+1:00
C'est pas mal du tout... fonctionnellement.

Mais une petite optimisation s'impose dans la 2ème partie. Tu as mis 2 boucles 'while pour supprimer les dates des fichiers. Tu peux utiliser 'extract pour ça, ce sera plus simple et plus rapide.
De plus, je pense que les 'head sont superflus car les 'forskip et 'forall replacent la série à son début en sortant (ce n'était effectivement pas le cas avec d'ancienne version de Rebol2).

Je te laisse le soin de faire ses corrections car tu te débrouille bien
nve3-Dec-2010/18:21:28+1:00
Effectivement, c'est assez bluffant...
V'la :

diff-directories: func [dir [file!] /date /full /local new-lst old-lst file diff diff-lst] [
	diff-lst: []
	new-lst: read dir
	forall new-lst [new-lst: back insert next new-lst get-modes dir/(new-lst/1) 'modification-date]
	old-lst: any [all [exists? fic: %old-lst.txt load fic] make block! 20]
	save %old-lst.txt new-lst
	if 0 < length? old-lst [
		if any [date full] [
			forskip new-lst 2 [
				file: pick new-lst 1
				new-date: select new-lst file
				old-date: select old-lst file
				if any [not new-date not old-date 0:00 < diff: difference new-date old-date][append diff-lst file]
			]
		]
	]	
	if not date [
		new-lst: extract new-lst 2
		either 0 < length? old-lst [
			old-lst: extract old-lst 2
			diff: difference new-lst old-lst
			append diff-lst diff
		][append diff-lst new-lst]
	]
	return copy diff-lst
]

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2