2012-02-17 2 views
9

Ho una semplice funzione di C# che crea un file XML di base e consente di risparmiare:XmlDocument Salva mantiene file aperto

private void CreateXMlFile(string Filename, string Name, string Company) 
     { 
      XmlDocument doc = new XmlDocument(); 
      XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
      doc.AppendChild(docNode); 

      XmlNode licenseNode = doc.CreateElement("license"); 
      doc.AppendChild(licenseNode); 

      XmlNode node = doc.CreateElement("Name"); 
      node.AppendChild(doc.CreateTextNode(Name)); 
      licenseNode.AppendChild(node); 

      node = doc.CreateElement("Company"); 
      node.AppendChild(doc.CreateTextNode(Company)); 
      licenseNode.AppendChild(node); 


      doc.Save(Filename); 
     } 

Quando si tenta di modificare o eliminare il file ottengo sempre seguente errore:

The process cannot access the file because it is being used by another process.

XmlDocument non dispone di routine di eliminazione o chiusura incorporate e si chiede come posso forzare la chiusura del file prima di modificarlo o eliminarlo in seguito.

Ho cercato di salvare il file utilizzando StreamWriter:

StreamWriter outStream = System.IO.File.CreateText(outfile); 
      outStream.Write(data); 
      outStream.Close(); 

Ma questa non fare la differenza con lo stesso errore.

Il tuo consiglio è molto apprezzato.

Grazie

+0

Hai provato a scriverlo con un'istanza di una scrittura in streaming invece di passare il nome del file da salvare? – Steve

+0

Ho avuto lo stesso problema, ma il mio codice stava caricando prima l'XML se esisteva. L'oggetto 'XmlReader' doveva essere chiuso prima che il blocco del file fosse liberato. –

risposta

1

Il tuo codice è a posto. L'ho provato sulla mia macchina e non è rimasto nessun blocco dopo Save().

Provare a utilizzare Unlocker (http://www.softpedia.com/get/System/System-Miscellaneous/Unlocker.shtml) per verificare se si è realmente colui che detiene il blocco.

Quale framework .NET usi? C'è anche una relazione (http://bytes.com/topic/net/answers/467028-xmldocument-save-does-not-close-file-properly) che non era riproducibile.

+0

Viene bloccato dallo studio di visualizzazione vshost.exe. Ho appena compilato. 3.5 e lo stesso problema. – Belliez

+0

Potresti creare un progetto vuoto con quel metodo chiamato con un clic del pulsante e controllare dopo il clic se il file è bloccato? – BlueM

4

Invia flusso al metodo di salvataggio di XmlDocument anziché al nome del file.

private static void Main(string[] args) 
    { 
     CreateXMlFile("c:\\test.xml", "testName", "testCompany"); 
    } 

    private static void CreateXMlFile(string Filename, string Name, string Company) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
     doc.AppendChild(docNode); 

     XmlNode licenseNode = doc.CreateElement("license"); 
     doc.AppendChild(licenseNode); 

     XmlNode node = doc.CreateElement("Name"); 
     node.AppendChild(doc.CreateTextNode(Name)); 
     licenseNode.AppendChild(node); 

     node = doc.CreateElement("Company"); 
     node.AppendChild(doc.CreateTextNode(Company)); 
     licenseNode.AppendChild(node); 
     StreamWriter outStream = System.IO.File.CreateText(Filename); 

     doc.Save(outStream); 
     outStream.Close(); 
    } 

Ho tentato di eseguire il codice sopra e funziona alla fine.

+0

Ho provato questo e quando vado a cancellare il file ottengo lo stesso errore. – Belliez

+0

Puoi provare a cambiare il percorso del file? – AshokD

+0

ha provato anche la nuova posizione e lo stesso. Ho anche disabilitato Livedrive (backup online) nel caso questo interferisse. – Belliez