Gambas France BETA


Pas de compte ? Incription

[Résolu]Surveiller un fichier texte.

Ce sujet est résolu.

1
AuteurMessages
loki#1 Posté le 18/8/2011 à 11:57:00
Bonjour,

Je fais un petit programme qui me calcul les % a partir d'un fichier .txt que me fait un autre programme.
Comment surveiller la création du fichier .txt et les changements du fichier .txt

Merci a ceux qui pourront m'aider.
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
linuxos#2 Posté le 18/8/2011 à 12:32:00
Un peu de sel, de poivre et la crevette sera... Bonjour,

Il faudrait que tu nous en dise un peu plus sur ton projet car il existe plusieurs manieres
des faire les choses selon les cas.


1 - pour détecter les modifications d'un fichier tu peux te baser sur:

- la date + heure
- le checksum du fichier ( commande linux: checksum <fichier>)
- le nom si il change a chaque modif/creation

2 - pour la création ou existance d'un nouveau fichier

- compter le nombre de fichiers dans le répertoire ou se situe les fichiers crées/nouveaux
- tester la présence d'un fichier en particulier si tu connais le nom exacte


Ainsi tu comprends qu'il y plusieurs cas de figure et qu'il te faut être plus précis
dans tes explications pour que l'on puisse t'aider.

Olivier

Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
loki#3 Posté le 18/8/2011 à 13:04:00
salut,

En faite mon problème n'est pas trop le changement du contenue que j'arrive a résoudre car chaque entrée dans mon fichier .txt est, ou numéroté, ou ajoute une ligne donc facilement reconnaissable.

Mon problème est sur le fait d’être a l'écoute tout le temps du fichier .txt sachant que les entrées sont faites aléatoirement dans le temps.

Pour le fichier je lui montre au début manuellement l'emplacement (ça lui permet d'avoir l'emplacement et le nom) puis le cycle des entrées se fait (la je veut calculer mes % en direct) puis le fichier .txt s'archive et un nouveau fichier .txt est créé qui remplace le premier au même nom(les noms change chaque jours mais pas la même journée).

voila quelques infos supplémentaires.
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
linuxos#4 Posté le 18/8/2011 à 14:18:00
Un peu de sel, de poivre et la crevette sera... Alors dans ce cas, il faut que tu me donne le bout de code qui tu a ecrit
et que tu me décrive un peu plus ou tu affiche le résultat (qui ne s'affiche pas pour le moment)
le type d'object.... enfin ce qu'il faut pour que je puisse t'aider.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
loki#5 Posté le 18/8/2011 à 16:54:00
Merci pour tes réponses rapides ;)

Mais sleep et wait j'ai déja testé dans une boucle while > wend ça ne laisse pas afficher le programme, seule la boucle et les calculs se fonts mais rien ne s'affiche, il n'y a que la console qui fonctionne.
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
linuxos#6 Posté le 18/8/2011 à 21:08:00
Un peu de sel, de poivre et la crevette sera... C'est normal, quand les evenements sont trop rapide, il faut laisser du temps a l'interface
pour afficher les résultats:

un petit WAIT 0,1 par exemple redonne du temps a l'interface pour rafraichir
le contenu de ses objets.


Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
spheris#7 Posté le 18/8/2011 à 21:17:00
loki,
une autre solution toute simple consiste à stocker dans une variable booléenne à chaque modif de fichier.
Ainsi, dans ton code, lors de la modification de ton fichier tu passe cette variable à 1.
De ce fait il est en premanence possible d'identifier un changement quelquonque dans ton fichier.
Bonne soirée
;) ;)
loki#8 Posté le 18/8/2011 à 21:48:00
@linuxos
J'ai monté mon wait et sleep a 1,5,10,25 mais rien n'y fait ou alors j'en ai fait une mauvaise utilisation...

@spheris
J'ai rien compris :rendeer: :rendeer: :rendeer:
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
linuxos#9 Posté le 18/8/2011 à 22:02:00
Un peu de sel, de poivre et la crevette sera... Alors dans ce cas, il faut que tu me donne le bout de code qui tu a ecrit
et que tu me décrive un peu plus ou tu affiche le résultat (qui ne s'affiche pas pour le moment)
le type d'object.... enfin ce qu'il faut pour que je puisse t'aider.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Prokopy#10 Posté le 18/8/2011 à 22:03:00
Kinder PinguiSalut,

En fait ce que vous cherchez à faire c'est ce que fait l'instruction Watch non ?

1
PUBLIC hFile AS File hFile = OPEN "/home/moi/fichier.txt" FOR READ WATCH'...PUBLIC SUB File_Read() DIM iByte AS Byte READ #hFile, iByte PRINT "Un nouvel octet dans le fichier : " & iByteEND


Ensuite à chaque appel de File_Read() tu récupères un octet de ton fichier, et tu peux ainsi reconstituer la ligne complète. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
loki#11 Posté le 18/8/2011 à 23:31:00
@Prokopy
Avant de poster j'avais regardé sur la doc car j'avais vu qu'on pouvait surveiller un port série avec WATCH et j'ai pas réussi a m'en servir (je vient de réessayer mais rien a faire) si tu y arrive :D

@linuxos
je te mettrai mon bout de code demain ;) (je vais continuer d'essayer des trucs... avec un peu de chance :roll: )
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
loki#12 Posté le 19/8/2011 à 12:34:00
J'ai enfin réussi, je sais pas si c'est ce qu'il faut faire mais sa l'air de marcher...

J'ai fait comme ça:
1
' Gambas class file$hFile As File$dFile As DatePublic Sub Form_Open() Me.Left = Desktop.w $hFile = Open "/home/loki/gambas3_travail/testEC1/text.txt" For Watch $dFile = Stat("/home/loki/gambas3_travail/testEC1/text.txt").Time EndPublic Sub File_Read() Wait 2 If $dFile <> Stat("/home/loki/gambas3_travail/testEC1/text.txt").Time Then Print "changement" $dFile = Stat("/home/loki/gambas3_travail/testEC1/text.txt").Time Endif EndPublic Sub Button1_Click() Close #$hFile Me.Close End


Si il y a des choses plus faciles ou une autre façon de faire, n’hésiter pas ;)

Merci encore pour votre aide.
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
Prokopy#13 Posté le 19/8/2011 à 12:56:00
Kinder PinguiVoici le code que j'ai utilisé :

1
PRIVATE fichier AS FilePublic Sub Form_Open()fichier = OPEN "/home/adrien/test1" FOR READ WATCH 'On surveille le fichierEndPublic Sub File_Read() Dim s As String If Eof(fichier) Then Sleep 0.01 ' Ça ne sert à rien de boucler si on a tout lu (évite surconsommation CPU en rendant la main au système) Return Endif Line Input #fichier, s TextArea1.Text &= (s & "\n") '<== \n pour une jolie présentation EndPublic Sub Form_Close() Close #fichier 'On n'oublie pas de fermer le fichier quand on a terminéEnd


Ce code est dans la classe d'un formulaire où il y a un textArea pour afficher le fichier.

Par contre chez moi la fonction Eof() ne semble pas aimer quand je supprime des choses dans mon fichier. Mais si il n'y a que des ajouts dans le fichier ça va. :|

Pour ton code il ne faut pas mettre de Wait dans un évènement, ça cause des débordements de pile, utilise plutôt Sleep si tu veux rendre la main. Et puis deux secondes c'est beaucoup, ça risque de faire un sacré temps de réaction. Un centième de seconde ça suffit largement pour ne pas surcharger le système sans qu'il y ait de temps de réaction visible.

Sinon, comment tu récupères le nouveau contenu du fichier ?
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
loki#14 Posté le 19/8/2011 à 14:01:00
Effectivement avec SLEEP je n'ai plus de cycle processeur alors qu'avec WAIT je tournai entre 4% et 8%.

En fait le bout de programme que j'ai mis est juste pour la surveillance du fichier qui dès que la date d'enregistrement change le programme m'affiche "changement"

Dans le programme final le
1
PRINT "changement"

se transforme en
1
SubAnalyseFichier

un Sub ou sont fait la récupération des données et les analyses

Voila mais j'ai pas finis :lol: j'suis encore dans les tests...
Dell Vostro 3750
Ubuntu 13.04 - Gambas 3.4.1
1