使用没有 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;
}
有没有一种方法可以在没有 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;
}