为什么这不会将正确的字节写入文件?

时间:2011-09-01 19:46:26

标签: c# streamwriter

这是我写入文件的测试:

    [Test]
    public void CanWriteManifestToFile()
    {
        byte[] data = new byte[] { 0x00, 0x01, 0x80, 0x1f };
        MemoryStream ms = new MemoryStream(data);
        var mg = new ManifestGeneratorV1();
        mg.WriteManifestFile(ms, "TestManifest.mnf");

        Assert.IsTrue(File.Exists("TestManifest.mnf"));
        Assert.AreEqual(data, GetDataFromFile("TestManifest.mnf"));
    }

这是实际写作的WriteManifestFile方法:

    public void WriteManifestFile(MemoryStream ms, string filePath)
    {
        using (StreamWriter sw = new StreamWriter(filePath, false))
        {
            ms.Seek(0, 0);
            using (StreamReader sr = new StreamReader(ms))
            {
                sw.Write(sr.ReadToEnd());
            }
        }
    }

我的测试失败了。结果是以下字节数组{00,01,ef,bf,bd,1f}。现在,如果我将80更改为不以f8开头的内容,则一切正常。什么可能导致80更改为efbfbd

2 个答案:

答案 0 :(得分:4)

您在非字符串数据上使用字符串方法; ReadToEndWrite(string)。那是无效的;腐败是这种情况的直接结果(即通过文本Encoding运行任意数据)。请改用原始Stream API:

using(var file = File.Create(filePath))
{
    ms.Position = 0;
    ms.CopyTo(file);
}

或只是:

File.WriteAllBytes(filePath, ms.ToArray());

答案 1 :(得分:3)

StreamReader.ReadToEnd()返回一个字符串。这意味着它需要解释它从中读取的流中的字节。对于这种解释,我猜你使用的是UTF-8编码。这是错误的,因为你的字节不代表文字。

你真的想要读取字节并将它们写入文件而不需要任何解释。这样的事情。

var bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
using(var fileStream = new FileStream(...))
{
    fileStream.Write(bytes, 0, bytes.Length);
}