4

既存の xml ファイルが既に存在する場合、それを上書きしようとしています。

以下のコードを使用してファイルが存在するかどうかを確認し、存在する場合は上書きします。既存のファイルは非表示になっているため、上書きする前に非表示を解除しています。

ただし、ファイルに変更が加えられておらず、上書きは機能していません。

これは、私が以下で使用しているコードから、新しい xml データを書き込んでいる部分を除いたものです。

if(File.Exists(filePath))
{
     File.SetAttributes(filePath,FileAttributes.Normal);
     FileIOPermission filePermission = 
              new FileIOPermission(FileIOPermissionAccess.AllAccess,filePath);

     FileStream fs = new FileStream(filePath, FileMode.Create);

     XmlWriter w = XmlWriter.Create(fs);
 }
4

3 に答える 3

4

次のようにファイルに書き込んでみてください。

if(File.Exists(filePath))
{
     File.SetAttributes(filePath,FileAttributes.Normal);
     FileIOPermission filePermission = 
              new FileIOPermission(FileIOPermissionAccess.AllAccess,filePath);

     using(FileStream fs = new FileStream(filePath, FileMode.Create))
     {
         using (XmlWriter w = XmlWriter.Create(fs))
         {
             w.WriteStartElement("book");
             w.WriteElementString("price", "19.95");
             w.WriteEndElement();
             w.Flush();
         }
     }     
 }
于 2012-08-14T16:51:23.563 に答える
0

@Tommy が述べたように、コードが表示されず、FileStream. それとは別に、次の順序が発生する可能性がありますか?

  1. 初めてxmlファイルを作成する
  2. 同じセッションで同じファイルを再作成しようとしました。
  3. FileStreamp.1からまだファイルをロックしています
于 2012-08-14T18:13:51.323 に答える
0

私はこれを行いました。これにより、使用しているものに関係なく、すべてが動的に保たれXDocumentます。

private void WriteToXml(XDocument xDoc, string filePath)
{
    // Gets the root XElement of the XDocument
    XElement root = xDoc.Root;

    // Using a FileStream for streaming to a file:
    // Use filePath.
    // If it's a new XML doc then create it, else open it.
    // Write to file.
    using (FileStream writer = 
           new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))
    {
        // For XmlWriter, it uses the stream that we created: writer.
        using (XmlWriter xmlWriter = XmlWriter.Create(writer))
        {
            // Creates a new XML file. The false is for "StandAlone".
            xmlWriter.WriteStartDocument(false);

            // Writes the root XElement Name.
            xmlWriter.WriteStartElement(root.Name.LocalName);

            // Foreach parent XElement in the Root...
            foreach (XElement parent in root.Nodes())
            {
                // Write the parent XElement name.
                xmlWriter.WriteStartElement(parent.Name.LocalName);

                // Foreach child in the parent...
                foreach (XElement child in parent.Nodes())
                {
                    // Write the node with XElement name and value.
                    xmlWriter.WriteElementString(child.Name.LocalName, child.Value);
                }
                // Close the parent tag.
                xmlWriter.WriteEndElement();
            }
            // Close the root tag.
            xmlWriter.WriteEndElement();
            // Close the document.
            xmlWriter.WriteEndDocument();

            // Good programming practice, manually flush and close all writers
            // to prevent memory leaks.
            xmlWriter.Flush();
            xmlWriter.Close();
        }
        // Same goes here.
        writer.Flush();
        writer.Close();
    }
}

これが役立つことを願っています!

于 2014-02-17T15:07:56.187 に答える