Petit pb sur le XMLDocument

Le
Cyril
Bonjour,

J'ai un document XmlDocument qui me permet de stocker de données. Aucun
pb de ce côté là.
Cependant comment fait-on pour libérer complètement l'objet ??

Je fais un XmlDoc.Save(MyFile) et comme la fenêtre qui le gère n'est
pas fermée, si je réouvre le fichier et que j'écris dedans, lors de la
sauvegarde il me jette à la figure que le fichier est occupé par un
autre processus.

Il n'y a pas de Dispose() ni de Colse() au niveau du XmlDocument.
J'ai même essayé un "GC.ReRegisterForFinalize(XmlDoc);" mais comme je
n'y connais rien en GarbageCollector.

Vous avez une solution ??

Merci
Vos réponses
Trier par : date / pertinence
Arnaud CLERET
Le #12231381
"Cyril" news:
Bonjour,

J'ai un document XmlDocument qui me permet de stocker de données. Aucun pb
de ce côté là.
Cependant comment fait-on pour libérer complètement l'objet ??

Je fais un XmlDoc.Save(MyFile) et comme la fenêtre qui le gère n'est pas
fermée, si je réouvre le fichier et que j'écris dedans, lors de la
sauvegarde il me jette à la figure que le fichier est occupé par un autre
processus.

Il n'y a pas de Dispose() ni de Colse() au niveau du XmlDocument.
J'ai même essayé un "GC.ReRegisterForFinalize(XmlDoc);" mais comme je n'y
connais rien en GarbageCollector....

Vous avez une solution ??

Merci





Bonsoir,

Sans connaitre le type de la variable MyFile, il est difficile de conclure.

Si le type de cette variable dérive de Stream, vous êtes alors contraint
d'appeler la méthode Close() afin de libérer les locks sur le fichier.

Si le type de cette variable est un string représentant le chemin vers le
fichier, les locks sont libérés après l'opération de sauvegarde. En interne
cette méthode repose sur un Stream sur lequel elle effectue bien le Close.

Compte tenu de l'erreur que vous obtenez, vous devez trsè certainement
utiliser une variable dérivant de Stream.

--
arno - http://www.dotnetguru2.org/acleret/
Cyril
Le #12231371
Arnaud CLERET avait énoncé :
"Cyril" news:
Bonjour,

J'ai un document XmlDocument qui me permet de stocker de données. Aucun pb
de ce côté là.
Cependant comment fait-on pour libérer complètement l'objet ??

Je fais un XmlDoc.Save(MyFile) et comme la fenêtre qui le gère n'est pas
fermée, si je réouvre le fichier et que j'écris dedans, lors de la
sauvegarde il me jette à la figure que le fichier est occupé par un autre
processus.

Il n'y a pas de Dispose() ni de Colse() au niveau du XmlDocument.
J'ai même essayé un "GC.ReRegisterForFinalize(XmlDoc);" mais comme je n'y
connais rien en GarbageCollector....

Vous avez une solution ??

Merci





Bonsoir,

Sans connaitre le type de la variable MyFile, il est difficile de conclure.

Si le type de cette variable dérive de Stream, vous êtes alors contraint
d'appeler la méthode Close() afin de libérer les locks sur le fichier.

Si le type de cette variable est un string représentant le chemin vers le
fichier, les locks sont libérés après l'opération de sauvegarde. En interne
cette méthode repose sur un Stream sur lequel elle effectue bien le Close.

Compte tenu de l'erreur que vous obtenez, vous devez trsè certainement
utiliser une variable dérivant de Stream.



En fait j'utilisais un String du chemin. En passant par un FileStream
ça fonctionne. ;-)
Mais je débute en XML, il me semblait qu'en utilisant le
XMLDocument.Save(MonFileStream), il écrasait le contenu du fichier...
en fait il le concatène à l'existant... Je ne trouve pas de propriété
qui lui indique de remplacer le contenu du fichier. Cela existe ?

Merci encore
Cyril
Le #12231361
Dans son message précédent, Cyril a écrit :
Arnaud CLERET avait énoncé :
"Cyril" news:
Bonjour,

J'ai un document XmlDocument qui me permet de stocker de données. Aucun pb
de ce côté là.
Cependant comment fait-on pour libérer complètement l'objet ??

Je fais un XmlDoc.Save(MyFile) et comme la fenêtre qui le gère n'est pas
fermée, si je réouvre le fichier et que j'écris dedans, lors de la
sauvegarde il me jette à la figure que le fichier est occupé par un autre
processus.

Il n'y a pas de Dispose() ni de Colse() au niveau du XmlDocument.
J'ai même essayé un "GC.ReRegisterForFinalize(XmlDoc);" mais comme je n'y
connais rien en GarbageCollector....

Vous avez une solution ??

Merci





Bonsoir,

Sans connaitre le type de la variable MyFile, il est difficile de conclure.

Si le type de cette variable dérive de Stream, vous êtes alors contraint
d'appeler la méthode Close() afin de libérer les locks sur le fichier.

Si le type de cette variable est un string représentant le chemin vers le
fichier, les locks sont libérés après l'opération de sauvegarde. En interne
cette méthode repose sur un Stream sur lequel elle effectue bien le Close.

Compte tenu de l'erreur que vous obtenez, vous devez trsè certainement
utiliser une variable dérivant de Stream.



En fait j'utilisais un String du chemin. En passant par un FileStream ça
fonctionne. ;-)
Mais je débute en XML, il me semblait qu'en utilisant le
XMLDocument.Save(MonFileStream), il écrasait le contenu du fichier... en fait
il le concatène à l'existant... Je ne trouve pas de propriété qui lui indique
de remplacer le contenu du fichier. Cela existe ?

Merci encore



J'ai trouvé une solution.
Je charge le fichier XML dans un dataset, et je fait un
MonFileStream.Flush() pour vider le fichier. Ensuite je réécris dedans
une fois mes traitements effectués.
C'est qu'en même bizarre je trouve de ne pas pouvoir spécifier
directement dans le XMLDocument la manière de sauvegarder les données.
Arnaud CLERET
Le #12231351
"Cyril" news:
Dans son message précédent, Cyril a écrit :
Arnaud CLERET avait énoncé :
"Cyril" news:
Bonjour,

J'ai un document XmlDocument qui me permet de stocker de données. Aucun
pb de ce côté là.
Cependant comment fait-on pour libérer complètement l'objet ??

Je fais un XmlDoc.Save(MyFile) et comme la fenêtre qui le gère n'est
pas fermée, si je réouvre le fichier et que j'écris dedans, lors de la
sauvegarde il me jette à la figure que le fichier est occupé par un
autre processus.

Il n'y a pas de Dispose() ni de Colse() au niveau du XmlDocument.
J'ai même essayé un "GC.ReRegisterForFinalize(XmlDoc);" mais comme je
n'y connais rien en GarbageCollector....

Vous avez une solution ??

Merci





Bonsoir,

Sans connaitre le type de la variable MyFile, il est difficile de
conclure.

Si le type de cette variable dérive de Stream, vous êtes alors contraint
d'appeler la méthode Close() afin de libérer les locks sur le fichier.

Si le type de cette variable est un string représentant le chemin vers
le fichier, les locks sont libérés après l'opération de sauvegarde. En
interne cette méthode repose sur un Stream sur lequel elle effectue bien
le Close.

Compte tenu de l'erreur que vous obtenez, vous devez trsè certainement
utiliser une variable dérivant de Stream.



En fait j'utilisais un String du chemin. En passant par un FileStream ça
fonctionne. ;-)
Mais je débute en XML, il me semblait qu'en utilisant le
XMLDocument.Save(MonFileStream), il écrasait le contenu du fichier... en
fait il le concatène à l'existant... Je ne trouve pas de propriété qui
lui indique de remplacer le contenu du fichier. Cela existe ?

Merci encore



J'ai trouvé une solution.
Je charge le fichier XML dans un dataset, et je fait un
MonFileStream.Flush() pour vider le fichier. Ensuite je réécris dedans une
fois mes traitements effectués.
C'est qu'en même bizarre je trouve de ne pas pouvoir spécifier directement
dans le XMLDocument la manière de sauvegarder les données.





Je pense que le problème ne vient pas de XmlDocument mais plutôt de la
manière dont vous utilisez le FileStream. Si vous ouvrez un fichier, le
lisez dans son intégralié puis que vous appelez la méthode Save sur l'objet
XML alors il est normal que le flux soit rajouté au texte existant puisque
la position de votre curseur au moment de l'opération de sauvegarde se
trouve en fin de fichier.

Pour résoudre votre problème voyez du coté des paramètres du constructeurs
de FileStream : new FileStream(path, FileMode.Truncate, FileAccess.Write,
FileShare.None);
Cyril
Le #12231341
Arnaud CLERET a formulé la demande :
"Cyril" news:
Dans son message précédent, Cyril a écrit :
Arnaud CLERET avait énoncé :
"Cyril" news:
Bonjour,

J'ai un document XmlDocument qui me permet de stocker de données. Aucun
pb de ce côté là.
Cependant comment fait-on pour libérer complètement l'objet ??

Je fais un XmlDoc.Save(MyFile) et comme la fenêtre qui le gère n'est pas
fermée, si je réouvre le fichier et que j'écris dedans, lors de la
sauvegarde il me jette à la figure que le fichier est occupé par un
autre processus.

Il n'y a pas de Dispose() ni de Colse() au niveau du XmlDocument.
J'ai même essayé un "GC.ReRegisterForFinalize(XmlDoc);" mais comme je
n'y connais rien en GarbageCollector....

Vous avez une solution ??

Merci





Bonsoir,

Sans connaitre le type de la variable MyFile, il est difficile de
conclure.

Si le type de cette variable dérive de Stream, vous êtes alors contraint
d'appeler la méthode Close() afin de libérer les locks sur le fichier.

Si le type de cette variable est un string représentant le chemin vers le
fichier, les locks sont libérés après l'opération de sauvegarde. En
interne cette méthode repose sur un Stream sur lequel elle effectue bien
le Close.

Compte tenu de l'erreur que vous obtenez, vous devez trsè certainement
utiliser une variable dérivant de Stream.



En fait j'utilisais un String du chemin. En passant par un FileStream ça
fonctionne. ;-)
Mais je débute en XML, il me semblait qu'en utilisant le
XMLDocument.Save(MonFileStream), il écrasait le contenu du fichier... en
fait il le concatène à l'existant... Je ne trouve pas de propriété qui lui
indique de remplacer le contenu du fichier. Cela existe ?

Merci encore



J'ai trouvé une solution.
Je charge le fichier XML dans un dataset, et je fait un
MonFileStream.Flush() pour vider le fichier. Ensuite je réécris dedans une
fois mes traitements effectués.
C'est qu'en même bizarre je trouve de ne pas pouvoir spécifier directement
dans le XMLDocument la manière de sauvegarder les données.





Je pense que le problème ne vient pas de XmlDocument mais plutôt de la
manière dont vous utilisez le FileStream. Si vous ouvrez un fichier, le lisez
dans son intégralié puis que vous appelez la méthode Save sur l'objet XML
alors il est normal que le flux soit rajouté au texte existant puisque la
position de votre curseur au moment de l'opération de sauvegarde se trouve en
fin de fichier.

Pour résoudre votre problème voyez du coté des paramètres du constructeurs de
FileStream : new FileStream(path, FileMode.Truncate, FileAccess.Write,
FileShare.None);



Oui j'ai vu cela. En fait, ce que je ne savais pas et que j'ai compris
par la suite, c'est que .NET gère le contenu XML d'un seul bloc. On ne
peut pas modifier un élément et mettre à jour que cet élément. Tout le
fichier est remis à jour.
Je pensais qu'on pouvait gérer la situation comme au temps des fichiers
.ini où on ne modifiait qu'un seul élément : gain de temps et de
ressources.
Dommage que Crosoft n'est pas implémenté cette possibilité.

Cyril et son association "PSFI"
"Pour la Sauvegarde des Fichiers Ini" :')
Publicité
Poster une réponse
Anonyme