ouvrir en lecture un fichier deja utiliser

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

ouvrir en lecture un fichier deja utiliser

Message par case »

voila j'ai besoin de lire en temps reel un log (simple fichier texte généré par un logiciel)

je peux l'ouvrir avec le bloc note, avec blitz+(j'avais deja fait un programme similaire en blitz) , mais pas moyen de le faire avec pure basic

avec openfile() ca ne fonctionne pas et c'est normal, car il faut les droits en lecture et ecriture ce qui semble logique

mais avec readfile() ca ne fonctionne pas non plus !!!

y a t'il une bidouille possible pour resoudre mon probleme un flag caché, une porte secrete ?

pitié je ne veux pas etre obligé de retourner programmer en Blitz plus :)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Si les commandes de PB ne marchent vraiment pas pour une histoire de droit, essaye avec les API windows (si tu ne cherches pas à faire un EXE multi plateformes).

Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message par Lna »

Si ça peut te dépanner en attendant de trouver une solution plus viable, fait en une copie avec CopyFile(...), pour lire le fichier copié, en le supprimant à la fin. 8O

@ peluche
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

merci lna mais ca ne marche pas puisqu'il faudrais que je copie le fichier en boucle pour pouvoir avoir les modifications en temps reel de plus il faudrais que je parcours tout le fichier a chaques fois pour n'avoir que les modficatons... ou tout au moins que garde la position on je suis. mais ca serais un peu lourd quand meme de faire comme ca :)

merci pour l'idee en tout cas

les api je vais avoir du mal j'ai aucune idee de comment faire
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message par Lna »

Il y a déjà eu des discutions sur le forum anglophone sur le sujet. 8O

Accessing - files in use -

http://www.purebasic.fr/english/viewtop ... adfile+api

Il y en a peut-être d'autres sujets semblables, avec d'autres solutions. 8O

Lances des recherches sur les mots clés. :wink:

@ peluche
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

bon pas trouvé de solution viable pour le moment et ce n'est pas faute d'avoir cherché :)
et puis il est tard je verrais si la nuit me porte conseil ^^
ImageImage
brossden
Messages : 821
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

As tu essayé la commande ReadFile() qui n'ouvre le fichier qu'en lecture seul.
J'ai essayé de lire une fichier sur mon disque dur déjà ouvert avec une autre application cela fonctionne trés bien !

Code : Tout sélectionner

If ReadFile(0,"Monfichier.txt")
  For n=1 To 10
    Txt.s + ReadString(0)
  Next
  MessageRequester("Infos Lues",Txt)
EndIf
Denis

Bonne Jounée à tous
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Tout dépend de comment le fichier est ouvert et ça des deux cotés!

J'ai créé un fichier que j'ouvre d'un coté en OpenFile et de l'autre en ReadFile...case a raison ça ne marche pas! :?

Par contre si on ouvre des deux cotés en ReadFile alors la ça marche! :D

Ce qui veut dire que si un fichier est ouvert en OpenFile (lecture/écriture) d'un coté alors il bloque le ReadFile de l'autre! :?

@case
Si tu gères les deux ouvertures par PureBasic alors fais le en ReadFile les deux! :D
Si tu ne gères pas l'une des ouvertures parce qu'elle est faite par un autre logiciel et certainement en OpenFile alors je ne t'ai pas trop avancé! :?

:wink:
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

La soluce de Lna qui est de copier le fichier n'est pas mal et reste pour l'instant une soluce qui marche! :wink:

Ton problème avec cette soluce est que tu dois lire plusieurs fois le fichier pour savoir s'il n'a pas été modifié!
Pourquoi ne te sers-tu pas de la date du fichier pour être averti qu'il a été modifié et là de le copier et le lire! :D

Code : Tout sélectionner

GetFileDate(NomFichier$, TypeDate)
A toi de voir! :wink:
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

RV a écrit :La soluce de Lna qui est de copier le fichier n'est pas mal et reste pour l'instant une soluce qui marche! :wink:

Ton problème avec cette soluce est que tu dois lire plusieurs fois le fichier pour savoir s'il n'a pas été modifié!
Pourquoi ne te sers-tu pas de la date du fichier pour être averti qu'il a été modifié et là de le copier et le lire! :D

Code : Tout sélectionner

GetFileDate(NomFichier$, TypeDate)
A toi de voir! :wink:
en fait il s'agit d'un log de chat dans un mmorpg(everquest2), je programme un utilitaire qui doit aider plusieur personnes a gérer un event serveur avec prises de screenshot de l'interieur des habitation des joueurs, par defaut le jeux prend des screenshot et les nomes screenshot1,screenshot2,screenshot3 etc...
j'ai fais un logiciel qui surveille le repertoire ou le jeu stocke les images, les deplace , les renomment avec le nom du joueur et les convertis a la volée en png/jpeg pour utilisation web
tartampion1,tartampion2,tartampion3,
ce que je veux c'est pourvoir commander ce logiciel a l'interieur du jeu lui meme en utilisant des mots clefs par exemple /screenshotformat png /thumbnail on /player tartampion /player durand
de facon a ce que l'on ai pas besoin de faire alt-tab, aller dans le logiciel modifier les noms , cocher les otions etc...
le moyen que j'ai trouvé est d'utiliser le log de sortie du jeu, je peux tres bien le lire sous blitz par exemple donc je suppose que le fichier n'est pas locké mais que la facon dont pure basic y accede n'est pas la meme :/
il doit forcément y avoir une solution sinon Mark Sibly n'aurais pas pu l'utiliser dans blitz :)
je vais regarder du coté des api windows meme si je n'ai aucune idée de ce que je dois chercher ni comment les utiliser ... je crois ne pas avoir le choix...
ImageImage
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Si tu as jaPBe, il y a un fichier "Include" (dans le répertoire jaPBe/Include"), qui s'appelle "API-FileHandle.pbi".

Tu peux toujours voir si ça résoud ton problème.
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

J'ai refait le test avec d'un côté une ouverte en OpenFile puis de l'autre une ouverture avec la procédure API_FileRead() de API-FileHandle.pbi et effectivement ça marche! :D
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

me reste plus qu'a telecharger japbe :)

et sinon comment ca fonctionne les .pbi ? on doit les metre a quel endroit pour les avoir dans pure basic ?

y a t'il un dossier special ?
ImageImage
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

bon probleme... !!!

le programme stop avec le debuger avec une erreur
illegal memory acess
sur cette ligne

*File\FHandle=CreateFile_(File$,#GENERIC_READ,#FILE_SHARE_READ,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)

Procedure API_FileReadEx(*File.API_FileHandle,File$,BufferLen)

dans cette procedure

Code : Tout sélectionner

Procedure API_FileReadEx(*File.API_FileHandle,File$,BufferLen)
*File\FHandle=CreateFile_(File$,#GENERIC_READ,#FILE_SHARE_READ,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)
  If *File\FHandle=#INVALID_HANDLE_VALUE
    ProcedureReturn #False
  Else
    *File\BufferLen=BufferLen
    *File\Buffer=AllocateMemory(*File\BufferLen)
    *File\ReadPos=*File\Buffer
    *File\DataInBuffer=0
    ProcedureReturn #True
  EndIf
EndProcedure

tout ca avec japbe
ImageImage
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

As-tu gardé dans ton code la structure API_FileHandle ainsi que toutes les procédures du fichier API-FileHandle.pbi?

Car en rajoutant ça à la fin, ça marche!

Code : Tout sélectionner

FHandle.API_FileHandle
File$="c:\Test.txt"

;Création du fichier
If API_FileCreate(FHandle,File$)
   API_WriteString(FHandle,"Test ")
   API_CloseFile(FHandle)
EndIf

;Lecture du fichier
If API_FileRead(FHandle,File$)
  MessageRequester("Info","Fichier ouvert.")
  API_CloseFile(FHandle)
Else
  MessageRequester("Info","Ne peut pas l'ouvrir.")
EndIf
Chez moi ça marche aussi bien sous JaPBe que sous PureBasic! :wink:
Répondre