Problème de sauvegarde de fichier Xml

Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
12 juillet 2012
- - Dernière réponse : soussous78
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
- 19 juil. 2012 à 18:32
Bonjour,

Donc voilà mon problème lorsque je sauvegarde mon fichier j'obtient l'erreur suivante :
Le processus ne peut pas accéder au fichier 'C:\wamp\www\Teste\Teste.kwmd', car il est en cours d'utilisation par un autre processus.

Explication :
A l'ouverture de mon programme j'appelle se fichier qui me sert a gérer les fichiers du projet puis après quand je veut ajouter un fichier au projet

Le fichier Xml:
<?xml version= "1.0" encoding="utf-8"?>
<Gestion>
  <Fichier>
     \index.ktc 
  </Fichier>
  <Langue>
    <FRA>\Langue\FRA.lang</FRA>
  </Langue>
</Gestion>


Voilà mon code:
public static string[] Fichier_kwmd(string Chemin, string mot_cle, string value)
        {
            string[] Data  = { "", "" }; //Stockage des données
            int nbr_enfant = 0; //Nombre d'enfant dans chaque noeud
            int x = 0;

            FileStream fs = new FileStream(Chemin, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            XmlDocument pDoc = new XmlDocument();
            pDoc.Load(fs);
            fs.Close();


            if (value == "get")
            {
                //Balise <Gestion>
                XmlNode curNode = pDoc.DocumentElement;

                //Nombre d'enfant dans chaque noeud
                for (int i = 0; i < curNode.ChildNodes.Count; i++)
                    nbr_enfant += curNode.ChildNodes.Item(i).ChildNodes.Count;

                //Définition de la taille du tableau
                Data = new string[nbr_enfant];

                //Récuperation des données
                for (int i = 0; i < curNode.ChildNodes.Count; i++)
                {
                    XmlNode ChildNode = curNode.ChildNodes.Item(i);//<TYPE_FICHIER>
                    if (ChildNode.ChildNodes.Count != 0)
                    {
                        for (int j = 0; j < ChildNode.ChildNodes.Count; j++)
                        {
                            XmlNode ValueNode = ChildNode.ChildNodes.Item(j);//<NOM_FICHIER>CHEMIN_FICHIER</NOM_FICHIER>
                            Data[x] = ValueNode.InnerText;
                            x += 1;
                        }
                    }

                }
            }
            else
            {
                XmlNode curNode = pDoc.DocumentElement;

                XmlElement NewNode = pDoc.CreateElement(value);
                NewNode.InnerText = @"\Langue"+value+".lang";

                for (int i = 0; i < curNode.ChildNodes.Count; i++)
                {
                    if (curNode.ChildNodes.Item(i).Name == mot_cle)
                    {
                        curNode.ChildNodes.Item(i).AppendChild(NewNode);
                        XmlTextWriter xtw = new XmlTextWriter(@"C:\wamp\www\Teste\Teste.kwmd", null);

                        pDoc.WriteContentTo(xtw);
                        xtw.Close();
                    }
                }                
            }

            return Data;
        }


J'ai essayer déjà divers méthode mais aucune marche, j'ai un autre bout de code sur le même principe est lui marche très bien

public static string Gestion_Conception(string Chemin, string Mot_Cle, string Nom, string Value)
        {
            string Data = ""; //Stockage des données

            XmlDocument pDoc = new System.Xml.XmlDocument();
            pDoc.Load(Chemin);
            if (Value == "get")
            {
                //Balise <List>
                XmlNode curNode = pDoc.DocumentElement;
                for (int i = 0; i < curNode.ChildNodes.Count; i++)
                    for (int j = 0; j < curNode.ChildNodes.Item(i).ChildNodes.Count; j++)
                        if (curNode.ChildNodes.Item(i).ChildNodes.Item(j).Name == Mot_Cle)
                        {
                            for (int x = 0; x < curNode.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Count; x++)
                            {
                                if (curNode.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Item(x).Name == Nom)
                                    Data = curNode.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Item(x).InnerText;
                            }
                        }
                if (Data == "")
                    Data = "0";
            }
            else
            {
                XmlNode curNode = pDoc.DocumentElement;

                for (int i = 0; i < curNode.ChildNodes.Count; i++)
                    for (int j = 0; j < curNode.ChildNodes.Item(i).ChildNodes.Count; j++)
                        if (curNode.ChildNodes.Item(i).ChildNodes.Item(j).Name == Mot_Cle)
                            for (int x = 0; x < curNode.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Count; x++)
                                if (curNode.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Item(x).Name == Nom)
                                    curNode.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Item(x).InnerText = Value;

                pDoc.Save(Chemin);
            }
            return Data;

        }

Voilà merci d'avance à celui ou celle qui trouvera mon problème où bien qui a une solution alternative
Afficher la suite 

7 réponses

Messages postés
13988
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 novembre 2019
319
0
Merci
Bonjour,

je n'utilise ta méthode pour faire du xml, alors ce que je vais écrire n'est peut être pas juste.

Tu dis que tes deux exemples sont sur le même principe.

Ca n'est pas tout à fait exact, dans le deuxième code tu lis et écrit à partir du xmldocument chargé dans pDoc.
Dans le premier code, tu charges le document dans pDoc et tu veux ensuite l'écrire avec un xmltextwriter, ce qui est différent.

Et ce qui est je pense la source de ton, erreur c'est que tu crées un xmltextwriter vers @"C:\wamp\www\Teste\Teste.kwmd" à chaque boucle et que même si tu as mis un .Close(), la liaison n'a pas le temps d'être clôturée avant la prochaine itération, peut être que
xtw = null;
aiderait un peu mais pas sûr.


Whismeril
Commenter la réponse de Whismeril
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
0
Merci
J'ai testé chez moi, ton code fonctionne bien. N'aurais tu pas d'autre routine utilisant le même fichier?

Par contre, tu peux simplifier ton code avec le xpath:
public static string[] Fichier_kwmd(string Chemin, string mot_cle, string value)
{
string[] Data = { "", "" }; //Stockage des données
int nbr_enfant = 0; //Nombre d'enfant dans chaque noeud
int x = 0;

FileStream fs = new FileStream(Chemin, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlDocument pDoc = new XmlDocument();
pDoc.Load(fs);
fs.Close();

if (value == "get")
{
   //Balise <Gestion>
   XmlNode curNode = pDoc.DocumentElement;

   //Nombre d'enfant dans chaque noeud
   nbr_enfant = curNode.SelectNodes("/*/*/*").Count;
   //Définition de la taille du tableau
   Data = new string[nbr_enfant];

   //Récuperation des données
   int _i = 0;
   foreach (XmlNode xn in curNode.SelectNodes("/*/*/*"))
   {
      Data[_i] = xn.InnerText;
      _i++;
   }
}
else
...
Commenter la réponse de soussous78
Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
12 juillet 2012
0
Merci
Whismeril :

En fait je me suis tromper dans le code en postant mais bon sa ne change rien l'erreur est la même.

else
                {
                    XmlElement NewNode = pDoc.CreateElement(value);
                    NewNode.InnerText = @"\Langue\FRA.lang";

                    for (int i = 0; i < curNode.ChildNodes.Count; i++)
                    {
                        if (curNode.ChildNodes.Item(i).Name == mot_cle)
                        {
                            curNode.ChildNodes.Item(i).AppendChild(NewNode);
                            pDoc.Save(Chemin);
                        }
                    }
                }

Pour le xtw = null; marche pas malheureusement

Soussous78 :

Merci pour la simplification c'est vrai que mon code n'est pas optimiser du tout

Donc c'est la que je comprend pas car mon fichier je l'ouvre une première fois a l'ouverture de l'application c'est tout après j'y ajoute ou retire une ligne à la fois alors que le deuxième code je l'appel beaucoup de fois est no-problème donc mystère

Merci pour votre aide
Commenter la réponse de flamby66
Messages postés
13988
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 novembre 2019
319
0
Merci
Bonjour,

essaye un pDoc.Close() à la fin de ta métohde Fichier_kwmd,
si tu ouvres une nouvelle instance de ton fichier à chaque fois que tu appelles Fichier_kwmd, ça peut expliquer le bug.


Whismeril
Commenter la réponse de Whismeril
Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
12 juillet 2012
0
Merci
Il n'y a pas de fonction Close() ou Dispose() pour XmlDocument
Commenter la réponse de flamby66
Messages postés
13988
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 novembre 2019
319
0
Merci
Ha j'avais bien dit que j'écrirais une bêtise!


Whismeril
Commenter la réponse de Whismeril
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
0
Merci
Es-ce que en remplacant

XmlTextWriter xtw = new XmlTextWriter(@"C:\wamp\www\Teste\Teste.kwmd", null);
pDoc.WriteContentTo(xtw);
xtw.Close();

par
pDoc.save(@"C:\wamp\www\Teste\Teste.kwmd");


cela fonctionne?
Commenter la réponse de soussous78