OVH Cloud OVH Cloud

Vidanger puis fermer un fichier ouvert en mode Output dans le cas d'un disque plein

17 réponses
Avatar
Eric
Bonjour à tous,

Pour un fichier ouvert en mode Output, la méthode "Close #" transfert le
contenu du buffer sur le disque avant de fermer le fichier. Si le disque
est plein, cette méthode plante et laisse le fichier ouvert (il restera
ouvert tant que l'application n'est pas déchargée).
Y'a-t-il un moyen pour vider le contenu du buffer et du fichier avant de
le fermer?

Merci

10 réponses

1 2
Avatar
LE TROLL
Salut, c'est pas exactement la réponse, mais, faire
un programme qui bloque le moindre fichier à cause du disque
plein, vaudrait peut être mieux commencer par le
commencement, lol, vider le disque...
---------

"Eric" a écrit dans le message de
news:
Bonjour à tous,

Pour un fichier ouvert en mode Output, la méthode "Close
#" transfert le contenu du buffer sur le disque avant de
fermer le fichier. Si le disque est plein, cette méthode
plante et laisse le fichier ouvert (il restera ouvert tant
que l'application n'est pas déchargée).
Y'a-t-il un moyen pour vider le contenu du buffer et du
fichier avant de le fermer?

Merci


Avatar
ng
Salut,


Pour un fichier ouvert en mode Output, la méthode "Close #" transfert le
contenu du buffer sur le disque avant de fermer le fichier. Si le disque
est plein, cette méthode plante et laisse le fichier ouvert (il restera
ouvert tant que l'application n'est pas déchargée).
Y'a-t-il un moyen pour vider le contenu du buffer et du fichier avant de
le fermer?



C'est plutot Print #X qui décharge le buffer en output.
Il faut dans ce cas mettre une gestion d'erreur et refaire un close dans
cette gestion de manière à fermer le fichier.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
Eric
Mon programme génère pleins de fichiers contenant des données récupérées
de la BDD avant de compresser le tout puis de les effacer.
Je dois donc envisager le cas d'un espace disque insuffisant! Et je vais
pas demander au client d'effacer le contenu de son disque pour me faire
plus de place hein ;)

LE TROLL wrote:
Salut, c'est pas exactement la réponse, mais, faire
un programme qui bloque le moindre fichier à cause du disque
plein, vaudrait peut être mieux commencer par le
commencement, lol, vider le disque...
---------

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

Bonjour à tous,

Pour un fichier ouvert en mode Output, la méthode "Close
#" transfert le contenu du buffer sur le disque avant de
fermer le fichier. Si le disque est plein, cette méthode
plante et laisse le fichier ouvert (il restera ouvert tant
que l'application n'est pas déchargée).
Y'a-t-il un moyen pour vider le contenu du buffer et du
fichier avant de le fermer?

Merci







Avatar
Eric
Non, le pb est justement au niveau du "close" qui transfert le buffer
sur le disque avant de fermer le fichier (cf la msdn).
Or je voudrais juste pouvoir fermer le fichier sans transférer le reste
des données du buffer puisque le disque est vraiment plein.

Extrait de la MSDN:
"When you close files that were opened for Output or Append, the final
buffer of output is written to the operating system buffer for that
file. All buffer space associated with the closed file is released."


ng wrote:
Salut,



Pour un fichier ouvert en mode Output, la méthode "Close #" transfert le
contenu du buffer sur le disque avant de fermer le fichier. Si le disque
est plein, cette méthode plante et laisse le fichier ouvert (il restera
ouvert tant que l'application n'est pas déchargée).
Y'a-t-il un moyen pour vider le contenu du buffer et du fichier avant de
le fermer?




C'est plutot Print #X qui décharge le buffer en output.
Il faut dans ce cas mettre une gestion d'erreur et refaire un close dans
cette gestion de manière à fermer le fichier.



Avatar
ng
Salut,

A au temps pour moi j'avais mal compris.
Je vois 2 solutions :

1/ rachète toi un disque
2/ essaye de calculer à l'avance la taille nécessaire (en arrondissant au
dessus) afin de vérifier s'il reste suffisamment d'espace disque.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
ng
Eric wrote:

Mon programme génère pleins de fichiers contenant des données récupérées
de la BDD avant de compresser le tout puis de les effacer.
Je dois donc envisager le cas d'un espace disque insuffisant! Et je vais
pas demander au client d'effacer le contenu de son disque pour me faire
plus de place hein ;)



Dans ce cas il faut anticiper l'espace necessaire et afficher un message
d'erreur s'il y en a pas assez. De tte facon pour ce genre de manip le
client doit bien savoir qu'il faut de la marge sur son disque, donc tu
estimes large et tu affiches un messages si c'est pas bon.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
LE TROLL
Ou effaces ton disque, lol !
Comme je te disais au départ, curieux ça de tester la taille
du disque dur, je n'ai jamais fait, car de toute façon, si
ça coince, il faut gérer tout, l'erreur, les fichiers
miroir, faire une reprise d'accès aux fichier, enfin, toute
la batterie infernale...
Pendant que j'y pense, as-tu testé s'il y avait de
l'électricité, car sinon, ben, le disque ne tourne pas "ab
absurdo!
---------

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

Salut,

A au temps pour moi j'avais mal compris.
Je vois 2 solutions :

1/ rachète toi un disque
2/ essaye de calculer à l'avance la taille nécessaire (en
arrondissant au
dessus) afin de vérifier s'il reste suffisamment d'espace
disque.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Avatar
Eric
c'est impossible d'estimer la place qu'il faudrait... Et ca prendrait
inutilement du temps dans les cas (normaux) où il y a assez de place.

ng wrote:
Eric wrote:


Mon programme génère pleins de fichiers contenant des données récupérées
de la BDD avant de compresser le tout puis de les effacer.
Je dois donc envisager le cas d'un espace disque insuffisant! Et je vais
pas demander au client d'effacer le contenu de son disque pour me faire
plus de place hein ;)




Dans ce cas il faut anticiper l'espace necessaire et afficher un message
d'erreur s'il y en a pas assez. De tte facon pour ce genre de manip le
client doit bien savoir qu'il faut de la marge sur son disque, donc tu
estimes large et tu affiches un messages si c'est pas bon.



Avatar
Jean-Marc
"Eric" a écrit dans le message de
news:%
c'est impossible d'estimer la place qu'il faudrait... Et ca prendrait
inutilement du temps dans les cas (normaux) où il y a assez de place.

ng wrote:
> Eric wrote:
>
>
>>Mon programme génère pleins de fichiers contenant des données récupérées
>>de la BDD avant de compresser le tout puis de les effacer.
>>Je dois donc envisager le cas d'un espace disque insuffisant! Et je vais
>>pas demander au client d'effacer le contenu de son disque pour me faire
>>plus de place hein ;)
>
>
> Dans ce cas il faut anticiper l'espace necessaire et afficher un message
> d'erreur s'il y en a pas assez. De tte facon pour ce genre de manip le
> client doit bien savoir qu'il faut de la marge sur son disque, donc tu
> estimes large et tu affiches un messages si c'est pas bon.



Hello,

alors fais tes écritures en C. En C, il y a fflush(file_descriptor) qui
force l'écriture sur le stream désigné. Ce n'est pas compliqué de faire
une petite dll qui implémente juste une fonction d'écriture.
Il ne te reste plus qu'à appeler cette fonction depuis ton prgramme VB.

Ce n'est qu'une solution parmi d'autres, je pense qu'il y a beaucoup plus
secure avec un design différent de ton appli.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Eric
ok merci
je pense que je vais essayer de concevoir l'appli autrement.

Jean-Marc wrote:
"Eric" a écrit dans le message de
news:%

c'est impossible d'estimer la place qu'il faudrait... Et ca prendrait
inutilement du temps dans les cas (normaux) où il y a assez de place.

ng wrote:

Eric wrote:



Mon programme génère pleins de fichiers contenant des données récupérées
de la BDD avant de compresser le tout puis de les effacer.
Je dois donc envisager le cas d'un espace disque insuffisant! Et je vais
pas demander au client d'effacer le contenu de son disque pour me faire
plus de place hein ;)




Dans ce cas il faut anticiper l'espace necessaire et afficher un message
d'erreur s'il y en a pas assez. De tte facon pour ce genre de manip le
client doit bien savoir qu'il faut de la marge sur son disque, donc tu
estimes large et tu affiches un messages si c'est pas bon.






Hello,

alors fais tes écritures en C. En C, il y a fflush(file_descriptor) qui
force l'écriture sur le stream désigné. Ce n'est pas compliqué de faire
une petite dll qui implémente juste une fonction d'écriture.
Il ne te reste plus qu'à appeler cette fonction depuis ton prgramme VB.

Ce n'est qu'une solution parmi d'autres, je pense qu'il y a beaucoup plus
secure avec un design différent de ton appli.



1 2