OVH Cloud OVH Cloud

Close et fermeture de fichier

6 réponses
Avatar
PurL
Bonjour,

J'ai une procédure qui s'occupe d'ouvrir un fichier :

sub Ouvrir()
dim nf as integer

nf=freefile
open fichier for binary as nf
end sub


si dans la suite du programme, je perds le handle (du moins sa valeur) "nf",
quel(s) moyen(s) ai(ent)-je pour fermer ce fichier ?

par exemple, si par erreur, j'appelle 2 fois la fonction Ouvrir() il me
faudra faire 2 close pour fermer complètement le fichier, or le premier
handle me sera inconnu !!

Merci pour votre aide,

PurL

6 réponses

Avatar
naudy cédric
nf est déclaré dans la sub "ouvrir".
Ainsi, sa portée ne dépasse pas cette sub. Lorsque l'on passe sur end sub,
votre variable n'existe plus...

Mettez la déclaration de nf au niveau global et vous ne le perdrez pas.

Cédric

"PurL" wrote in message
news:
Bonjour,

J'ai une procédure qui s'occupe d'ouvrir un fichier :

sub Ouvrir()
dim nf as integer

nf=freefile
open fichier for binary as nf
end sub


si dans la suite du programme, je perds le handle (du moins sa valeur)


"nf",
quel(s) moyen(s) ai(ent)-je pour fermer ce fichier ?

par exemple, si par erreur, j'appelle 2 fois la fonction Ouvrir() il me
faudra faire 2 close pour fermer complètement le fichier, or le premier
handle me sera inconnu !!

Merci pour votre aide,

PurL




Avatar
PurL
naudy cédric wrote:
nf est déclaré dans la sub "ouvrir".
Ainsi, sa portée ne dépasse pas cette sub. Lorsque l'on passe sur end
sub, votre variable n'existe plus...

Mettez la déclaration de nf au niveau global et vous ne le perdrez
pas.

Cédric



Je suis d'accord :) là n'est pas le probleme

La question est : Comment fermer un fichier dont on ne connait pas le handle
fourni à l'ouverture ?

Merci

PurL
Avatar
Olivier Besson
Tu lis l'aide de close et tu vois que si tu fait un close sans rien d'autre
ça ferme tous les fichiers ouverts par ton application. C'est la seule
solution simple.

--

Olivier Besson
Pour m'ecrire, supprimer le premier point de mon adresse.
(Je ne lis pas mes mails frequement)
To write me, remove first dot of my address (i don't read my mails very
frequently).



"PurL" a écrit dans le message de news:

naudy cédric wrote:
> nf est déclaré dans la sub "ouvrir".
> Ainsi, sa portée ne dépasse pas cette sub. Lorsque l'on passe sur end
> sub, votre variable n'existe plus...
>
> Mettez la déclaration de nf au niveau global et vous ne le perdrez
> pas.
>
> Cédric

Je suis d'accord :) là n'est pas le probleme

La question est : Comment fermer un fichier dont on ne connait pas le


handle
fourni à l'ouverture ?

Merci

PurL




Avatar
PurL
Olivier Besson wrote:
Tu lis l'aide de close et tu vois que si tu fait un close sans rien
d'autre ça ferme tous les fichiers ouverts par ton application.



Oui je sais, mais encore une fois, ce n'est pas l'objet de ma question :)
Je ne veux pas fermer TOUS les fichiers (j'en ai d'autres ouverts par
l'application qui ne doivent pas etre fermés)
mais fermer UN fichier dont je ne connais plus le handle...

C'est la seule solution simple.



Citation de moi :
"La complexité d'une solution n'a aucune importance dans le cas où celle-ci
résoud un probleme sans en créer d'autres"

PurL
Avatar
Olivier Besson
Citation de moi :
"Tu l'auras voulu".
1) Trouve le process_id de ton application (EnumProcesses)
2) Parcours tous les handles dont le owner_id == TonApplication_process_id
(NtQuerySystemInformation)
3) Récupère le nom de chaque handle (NtQueryObject)
4) Lorsque tu as le bon nom, tu peux le fermer.

Bien sur, tout ça c'est de l'API donc bonne recherche ...

(Il y a surement une solution plus simple à ton problème, en encapsulant les
commandes de fichier dans une classe, ou en posant un hook sur les
ouvertures de fichiers de ton application).

--

Olivier Besson
Pour m'ecrire, supprimer le premier point de mon adresse.
(Je ne lis pas mes mails frequement)
To write me, remove first dot of my address (i don't read my mails very
frequently).



"PurL" a écrit dans le message de news:

Olivier Besson wrote:
> Tu lis l'aide de close et tu vois que si tu fait un close sans rien
> d'autre ça ferme tous les fichiers ouverts par ton application.

Oui je sais, mais encore une fois, ce n'est pas l'objet de ma question :)
Je ne veux pas fermer TOUS les fichiers (j'en ai d'autres ouverts par
l'application qui ne doivent pas etre fermés)
mais fermer UN fichier dont je ne connais plus le handle...

> C'est la seule solution simple.

Citation de moi :
"La complexité d'une solution n'a aucune importance dans le cas où


celle-ci
résoud un probleme sans en créer d'autres"

PurL





Avatar
PurL
Olivier Besson wrote:
Citation de moi :
"Tu l'auras voulu".



:)

1) Trouve le process_id de ton application (EnumProcesses)
2) Parcours tous les handles dont le owner_id = > TonApplication_process_id (NtQuerySystemInformation)
3) Récupère le nom de chaque handle (NtQueryObject)
4) Lorsque tu as le bon nom, tu peux le fermer.

Bien sur, tout ça c'est de l'API donc bonne recherche ...




evidement j'en attendais pas moins :p

Tu vois qd tu t'enerves :))

Merci,

PurL