IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Libérer les ressources d'un fichier accédé par XmlDocument


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 10
    Par défaut Libérer les ressources d'un fichier accédé par XmlDocument
    Bonjour,

    Je solicite votre aide pour un petit problème que je rencontre a propos de la manipulation de fichier Xml.
    Mon scrit est tres simple. Il crée un fichier xml, et insère dans une de ses balises le contenu de n fichier xml. Ensuite, les fichiers sont supprimés.

    Le problème est que je n'arrive pas a supprimer les fichiers xml une fois ouvert avec XmlDocument car j'ai l'erreur suivante lors du delete du fichier :
    Le processus ne peut pas accéder au fichier car il est en cours d'utilisation par un autre processus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    XmlDocument xmlFileToSend = new XmlDocument();
    xmlFileToSend.AppendChild(xmlFileToSend.CreateXmlDeclaration("1.0" , "UTF-8" , "yes"));
    xmlFileToSend.AppendChild(xmlFileToSend.CreateElement("list"));
    xmlFileToSend.Save(_resultsDirInfo.FullName + "\\" + fileToSendName + ".xml");
     
    foreach (string file in xmlfiles){
     
        XmlDocument xmlCurrentFile = new XmlDocument();
        xmlCurrentFile.Load(file.ToString()); 
        XmlNode nodeImport = xmlFileToSend.ImportNode(xmlCurrentFile.GetElementsByTagName("host")[0] , true);
        xmlFileToSend.DocumentElement.AppendChild(nodeImport); 
        xmlFileToSend.Save(_resultsDirInfo.FullName + "\\" + fileToSendName + ".xml");   
        File.Delete(file);
    }
    Merci de votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Par défaut
    Salut,

    Je pense que cela devrait suffire à relâcher le doc XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xmlCurrentFile = null;
    File.Delete(file);
    Si ce n'est pas le cas, il regarder du coté du GC afin de relâcher la ressource

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 10
    Par défaut
    J'avais déjà essayé de pointer mon XmlDocument à null mais ca n'a rien changé.

    La seule solution est bien d'invoquer le garbagecollector juste avant la suppresion, ce qui me parait quand même curieux que ce soit la seule solution, et qu'il n'y ait pas de méthode Close ou Dispose sur l'objet XmlDocument.

    J'ai jeté un oeil sur le msdn et j'ai vu qu'il existe une méthode privée Finalize pour libérer la ressource. Mais étant privée je ne vois pas comment et si il est possible d'appeler cette méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GC.Collect();
    GC.WaitForPendingFinalizers();

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Par défaut
    Bonsoir,

    Une solution peut être, plus propre que d'appeler manuellement le garbage collector : charger autrement le fichier XML.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (Stream s = File.OpenRead(file))
    {
        xmlCurrentFile.Load(s);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Libérer les ressources
    Par xokami35x dans le forum Langage
    Réponses: 10
    Dernier message: 09/09/2009, 20h48
  2. Libérer les ressources
    Par mouloudéen dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/03/2009, 09h46
  3. [SWT] Libérer les ressources
    Par soft0613 dans le forum SWT/JFace
    Réponses: 15
    Dernier message: 04/08/2008, 13h32
  4. Réponses: 3
    Dernier message: 09/10/2006, 19h22
  5. Libérer les ressources lors de la fermeture d'un programme
    Par Heliopraetor dans le forum DirectX
    Réponses: 10
    Dernier message: 14/09/2004, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo