使用没有 BOM 的 FileStream 编写流?

Writing a Stream with FileStream without a BOM?

有没有一种方法可以在没有 BOM 的情况下使用 FileStream 编写 Stream? 我在这里所做的是首先将 XmlNode 转换为 Stream 并在稍后将流写入文件。我需要它采用 Stream 的形式,以便与我的功能互操作。我可以用其他方式来做,但如果可能的话,我想这样做。

Stream^ XmlToStream(XmlNode^ Node)
{
    Stream^ stream = gcnew MemoryStream();

    XmlDocument^ xmlDoc = gcnew XmlDocument();
    xmlDoc->PreserveWhitespace = true;
    xmlDoc->LoadXml(Node->OuterXml);
    xmlDoc->Save(stream);

//OR THIS:
//TODO: Handle exceptions
//  XmlWriterSettings^ settings = gcnew XmlWriterSettings();
//  settings->Encoding = System::Text::Encoding::UTF8;
//  settings->OmitXmlDeclaration = true;
//  settings->NewLineChars = "\n";
//  XmlWriter^ xwriter = XmlWriter::Create(stream, settings);
//  Node->WriteTo(xwriter);
//  xwriter->Close();

    return stream;
}

void StreamToFile(Stream^ DataStream, String^ FilePath)
{
    FileStream^ fileStream = gcnew FileStream(FilePath, FileMode::Create);
    if (DataStream->CanSeek)
    {
        DataStream->Seek(0, SeekOrigin::Begin);
    }
    DataStream->CopyTo(fileStream);
    fileStream->Close();
}

您正在获取 BOM,因为通过写入 MemoryStream,框架不知道正确的编码应该是什么。所以它会针对 XmlDocument 的编码进行处理,默认情况下它是 utf-8。这也会生成 BOM。

要控制它,您需要将 TextWriter 对象传递给 XmlDocument::Save() 方法。这可以是 StreamWriter,它又写入 MS。默认情况下,StreamWriter 也使用 utf-8 编码,但不会生成 BOM,除非您明确询问,只是您想要什么。像这样:

Stream^ XmlToStream(XmlNode^ Node)
{
    auto stream = gcnew MemoryStream();
    auto writer = gcnew StreamWriter(stream);
    //...
    xmlDoc->Save(writer);
    writer->Flush();
    return stream;
}