相关疑难解决方法(0)

使用MemoryStream写出XML

我注意到有两种不同的方法可以将数据写入XML文件(为简洁起见,省略了错误处理).

第一种方法是构建XML文档,然后将XML保存到文件中:

using (XmlWriter writer = XmlWriter.Create(fileName))
{
    writer.WriteStartDocument(true);
    writer.WriteStartElement("parentelement");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是创建MemoryStream,然后将MemoryStream保存到文件中:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
MemoryStream ms = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
    writer.WriteStartDocument(true);
    writer.WriteStartElement("parentelement");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

using (FileStream fs = File.Open(fileName, FileMode.Create, FileAccess.Write))
{
    ms.WriteTo(fs);
    ms.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

我猜测使用MemoryStream的逻辑是确保在尝试保存文件之前可以构建XML文件.在将条目添加到XML文件中时,MemoryStream方法是否会提供Atomic写入事件和/或防止写入问题?

任何人都可以解释这是否真的有必要或只是一种过度杀戮的方式来添加不必要的代码行到我的项目?

c# xml memorystream

8
推荐指数
1
解决办法
4万
查看次数

XMLDocument.Save是一个原子操作吗?

无论如何,使用XMLDocument.Save()创建的文件的另一个进程监视可能会遇到部分文件?如果Save()覆盖现有文件会有什么不同吗?

.net c# xmldocument

6
推荐指数
1
解决办法
1634
查看次数

c#文件移动和覆盖

我正在开发一个多线程应用程序.我的代码中有一处:

File.Delete(sidetapedata);
File.Move(sidetapedata2, sidetapedata); //sidetapedata and sidetapedata2 are two file paths that correspond to sidetapedata.txt and sidetaptdata2.txt in some directory.
Run Code Online (Sandbox Code Playgroud)

第二行有时运行良好,其他时候,它抛出IOException:

Cannot create a file when that file already exists.
Run Code Online (Sandbox Code Playgroud)

还有一个线程正在访问该sidetapedata文件,但该文件只读取此文件,没有写入操作.我正在使用锁来保护竞争条件.不知道为什么会这样.

更新:即使visual c#debugger向我显示此异常,查看包含这些文件的目录,我看到没有sidetapedata.txt文件,但有一个sidetapedata2.txt文件!

UPDATE2:另外,这一行为仅发生在sidetapedata.txtsidetapedata2.txt都是空白

c# multithreading ioexception race-condition

4
推荐指数
1
解决办法
4977
查看次数