Problème de sauvegarde de fichier Xml

flamby66 Messages postés 3 Date d'inscription dimanche 7 mars 2010 Statut Membre Dernière intervention 12 juillet 2012 - 11 juil. 2012 à 17:28
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

7 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
11 juil. 2012 à 20:12
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
0
soussous78 Messages postés 47 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 5 novembre 2016
11 juil. 2012 à 23:45
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
...
0
flamby66 Messages postés 3 Date d'inscription dimanche 7 mars 2010 Statut Membre Dernière intervention 12 juillet 2012
12 juil. 2012 à 09:48
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
12 juil. 2012 à 11:53
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
flamby66 Messages postés 3 Date d'inscription dimanche 7 mars 2010 Statut Membre Dernière intervention 12 juillet 2012
12 juil. 2012 à 14:14
Il n'y a pas de fonction Close() ou Dispose() pour XmlDocument
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
12 juil. 2012 à 15:38
Ha j'avais bien dit que j'écrirais une bêtise!


Whismeril
0
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
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?
0
Rejoignez-nous